| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2831 人关注过本帖
标题:一个把输入的16制数转换成二进制数,并输出的问题
只看楼主 加入收藏
cabin0120
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2006-9-6
结帖率:0
收藏
 问题点数:0 回复次数:7 
一个把输入的16制数转换成二进制数,并输出的问题

DATAS SEGMENT
DATA1 db 'inputerorr','$'
DATA2 DB 16 dup(?),'$'
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DI,DATA2
MOV CX,4
MOV BL,00H
L1:MOV AH,01
INT 21H
CMP AL,30H
JA L2
JMP L
L2:CMP AL,39H
JNA L4
CMP AL,41H
JA L3
JMP L
L3:CMP AL,46
JNA2 L5
L:LEA DX,DATA1
MOV AH,9
INT 21H
L4:SUB AL,30H
JMP L6
L5:SUB AL,37H
L6:PUSH CX
MOV CL,4
SHL AL,CL
MOV CX,4
SHL AL,1
ADC BL,30H
MOV [DI],BL
INC DI
LOOP L6
POP CX
LOOP L1
LEA DX,DATA2
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
程序执行后一输入字符,DOS界面就退出了,路过次地的高手帮小弟一把,谢谢了

搜索更多相关主题的帖子: 二进制数 CMP 堆栈 STACKS SEGMENT 
2007-11-11 20:56
Lotus_Hypnos
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-10-24
收藏
得分:0 

上面程序在L处结束没有退出,这样还会继续进行以下程序,导致在L6处不断循环,所以一输字符DOS界面就退了。下面的程序可用

stack segment stack 'stack'
stack ends

data segment
DATA1 DB 'inputerorr','$'
DATA2 DB 16 dup(?),'$'
data ends

code segment
start proc far
assume ss:stack,cs:code,ds:data
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax

LEA DI,DATA2
MOV CX,4
MOV BL,00H

L1: MOV AH,1
INT 21H
CMP AL,30H
JNB L2 ;AL>=30H
JMP L

L2: CMP AL,39H
JNA L4 ;AL<=39H
CMP AL,41H
JNB L3 ;AL>=41H
JMP L

L3: CMP AL,46H
JNA L5 ;AL<=46H

L: LEA DX,DATA1
MOV AH,9
INT 21H
JMP OT

L4: SUB AL,30H
JMP L7

L5: SUB AL,37H

L7: SHL AL,CL
L6: MOV BL,0
RCL AL,1
RCL BL,1
ADD BL,30H
MOV [DI],BL
INC DI
LOOP L6

MOV DL,0AH
MOV AH,2
INT 21H


LEA DX,DATA2
MOV AH,9
INT 21H

MOV AH,4CH
INT 21H


OT: ret

start endp
code ends
end start


2007-11-14 21:13
cabin0120
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2006-9-6
收藏
得分:0 
非常感谢....
不过还有一点不明白,如果我输入的是正确的16进制数的话,程序根本不会经过L,而且就算L不退出我也实在看不出为什么要死循环?????

[此贴子已经被作者于2007-11-16 17:58:41编辑过]

2007-11-16 17:42
cabin0120
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2006-9-6
收藏
得分:0 

您在开头加的 push ds
sub ax,ax
push ax
不懂是什么意思>>>>

2007-11-16 18:08
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
以下是引用cabin0120在2007-11-16 18:08:22的发言:

您在开头加的 push ds
sub ax,ax
push ax
不懂是什么意思>>>>

这是将DS的内容和0作为段地址和偏移地址入栈,以便在程序结束时用RET指令返回DOS,这是一种较好的工作方式。如果在主程序开始时没有用这三条指令在堆栈中建立返回信息,则在程序结束时就不能直接用RET指令,而应使用:
MOV AX,4C00H
INT 21H
指令返回。


其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2007-11-16 20:00
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
以下是引用zhulei1978在2007-11-16 20:00:26的发言:

这是将DS的内容和0作为段地址和偏移地址入栈,以便在程序结束时用RET指令返回DOS,这是一种较好的工作方式。如果在主程序开始时没有用这三条指令在堆栈中建立返回信息,则在程序结束时就不能直接用RET指令,而应使用:
MOV AX,4C00H
INT 21H
指令返回。

学习了,不过能不能再解释下,为什么这样比较好呢,用中断退出有什么不好的地方

还有,一开始ds不是还没赋值data的段地址,这个时候的ds保存的是什么,code的段地址吗?


从BFS(Breadth First Study)到DFS(Depth First Study)
2007-11-17 12:26
cabin0120
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2006-9-6
收藏
得分:0 

还是这个程序,我稍微改了一下,能调试出来,
第一个程序在第二程序的基础上加了红色部分,目的是想连续输入几个16进制数,但是在输入第二数时就出现了乱码,请教一下斑竹这是为什么???


一...................
DATAS SEGMENT
DATA1 db 'inputerorr','$' ;此处输入数据段代码 ]
DATA2 DB 16 dup(?),'$'
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DI,DATA2 ;此处输入代码段代码

MOV BL,4
L8:MOV CX,4
L1:MOV AH,01
INT 21H
CMP AL,30H
JA L2
JMP L
L2:CMP AL,39H
JNA L4
CMP AL,41H
JA L3
JMP L
L3:CMP AL,46
JNA L5
L:LEA DX,DATA1
MOV AH,9
INT 21H
JMP L1
L4:SUB AL,30H
JMP L6
L5:SUB AL,37H


L6: SHL AL,CL

L7: SHL AL,1

MOV BL,00H
RCL BL,1
ADC BL,30H
MOV [DI],BL
INC DI
LOOP L7


DEC BL
JNZ L8

MOV DL,0AH
MOV AH,2
INT 21H

LEA DX,DATA2
MOV AH,9
INT 21H

MOV AH,4CH
INT 21H
CODES ENDS
END START



二..................

DATAS SEGMENT
DATA1 db 'inputerorr','$' ;此处输入数据段代码 ]
DATA2 DB 16 dup(?),'$'
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DI,DATA2 ;此处输入代码段代码
MOV CX,4


L1:MOV AH,01
INT 21H
CMP AL,30H
JA L2
JMP L
L2:CMP AL,39H
JNA L4
CMP AL,41H
JA L3
JMP L
L3:CMP AL,46
JNA L5
L:LEA DX,DATA1
MOV AH,9
INT 21H
JMP L1
L4:SUB AL,30H
JMP L6
L5:SUB AL,37H


L6: SHL AL,CL

L7: SHL AL,1

MOV BL,00H
RCL BL,1
ADC BL,30H
MOV [DI],BL
INC DI
LOOP L7




MOV DL,0AH
MOV AH,2
INT 21H

LEA DX,DATA2
MOV AH,9
INT 21H

MOV AH,4CH
INT 21H
CODES ENDS
END START

[此贴子已经被作者于2007-11-18 8:57:38编辑过]

2007-11-17 21:11
longxies
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2007-11-14
收藏
得分:0 

我写的程序:
DATA SEGMENT
BJZF DW 'B'
COUNT EQU 16

DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
KJ DB 100 DUP (?)
TOP EQU $
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,TOP
MOV BX,BJZF
MOV DI,8000H
MOV CX,COUNT
MOV AH,02H
MOV SI,0
GO: CMP SI,4
JNZ GO1
MOV SI,0
MOV DL,3
INT 21H
GO1: TEST BX,DI
JZ J0
MOV DL,1
ADD DL,30H
INT 21H
SHR DI,1
INC SI
LOOP GO
JMP EN
J0: MOV DL,0
ADD DL,30H
INT 21H
SHR DI,1
INC SI
LOOP GO
EN: MOV AH,4CH
INT 21H
CODE ENDS
END START

2007-11-21 02:10
快速回复:一个把输入的16制数转换成二进制数,并输出的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024164 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved