一个关于十六进制转二进制的程序,求助

Jackindata
博客专家认证
2011-05-23 11:52:11
帮帮忙排错啊。。

;enter 4 hexidecimal number, and than print the corresponding binary number.

STA SEGMENT STACK
DB 100H DUP(?)
TOP LABEL WORD
STA ENDS

DATA SEGMENT
ARRAY DB 100H DUP(?)
DATA ENDS

CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,SS:STA,DS:DATA
START:
MOV AX,STA ;初始化
MOV SS,AX
LEA SP,TOP
MOV AX,DATA
MOV DS,AX
XOR SI,SI
XOR AH,AH

MOV CX,4
L1: MOV AH,01H ;输入,暂存在数组ARRAY中。
INT 21H
MOV ARRAY[SI],AL
INC SI
LOOP L1

MOV CL,4
XOR SI,SI
L2: MOV AL,ARRAY[SI] ;二重循环转换二进制。
SUB AX,30H
MOV BX,4
ROL AL,1
ROL AL,1
ROL AL,1
ROL AL,1
L3: XOR DL,DL
RCL AL,1
ADC DL,30H
MOV AH,02H
INT 21H
DEC BX
CMP BX,0
JNZ L3
LOOP L2

MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END START
...全文
270 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
iretf 2011-05-25
  • 打赏
  • 举报
回复
楼主的程序有两个问题:
1、int 21h的2号中断,是会改变al的值的。一般情况下中断执行后al将等于dl的值(当dl=09h时al=20h例外),而你用al来保存要转换的16进制字符。
2、转换二进制的时候忘记递增si,你的程序中始终转换的是array数组的第一个字符。

更改楼主的三处程序如下
;enter 4 hexidecimal number, and than print the corresponding binary number.

STA SEGMENT STACK
DB 100H DUP(?)
TOP LABEL WORD
STA ENDS

DATA SEGMENT
ARRAY DB 100H DUP(?)
DATA ENDS

CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,SS:STA,DS:DATA
START:
MOV AX,STA ;初始化
MOV SS,AX
LEA SP,TOP
MOV AX,DATA
MOV DS,AX
XOR SI,SI
XOR AH,AH

MOV CX,4
L1: MOV AH,01H ;输入,暂存在数组ARRAY中。
INT 21H
MOV ARRAY[SI],AL
INC SI
LOOP L1

MOV CL,4
XOR SI,SI
L2: MOV AL,ARRAY[SI] ;二重循环转换二进制。
SUB AX,30H
MOV BX,4
ROL AL,1
ROL AL,1
ROL AL,1
ROL AL,1
mov dh,al ;添加一句,使用dh替代al
L3: XOR DL,DL
RCL dh,1 ; 原RCL AL,1 相应更改而得
ADC DL,30H
MOV AH,02H
INT 21H
DEC BX
CMP BX,0
JNZ L3
inc si ;添加一句
LOOP L2

MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END START
masmaster 2011-05-24
  • 打赏
  • 举报
回复
;
;This Program Compiled Sucess by Masm 6.15
;
assume cs:code,ds:data,ss:stack
data segment
buff db 4,0,4 dup (0) ;指定输入缓冲区
data ends
stack segment stack ;定义栈段(不是必须的)
db 64 dup (0)
stack ends
code segment
start:
mov ax,data ;指明数据段
mov dx,ax

mov dx,offset buff ;调用10号功能输入字符串
mov ah,10
int 21h

xor ax,ax ;所用ax,dx寄存器清零
xor dx,dx
mov cx,4 ;循环次数
mov si,12 ;循环内移位次数
mov bx,offset buff+2 ;字符串首地址
s:
push cx ;保存计数器
mov dl,[bx] ;将字符与数字,字母等比较
cmp dl,'0'
jae j1
jmp exit
j1:
cmp dl,'9'
jbe j2
cmp dl,'a'
jae k1
jmp exit
k1:
cmp dl,'f'
jbe k2
jmp exit
j2:
sub dl,30h ;是数字0~9
jmp jx
k2:
sub dl,57h ;是字母a~f
jx:
mov cx,si ;将字符做移位处理
shl dx,cl ;每次移位递减
add ax,dx ;结果放在AX里
xor dx,dx ;必须将DX清零
pop cx ;恢复计数器
inc bx ;指向下一个字符
sub si,4 ;移位次数递减4
loop s

xchg ax,dx ;调用子程序,显示二进制
call dispbin
exit:
mov ah,4ch
int 21h
;input:dx
;显示子程序
dispbin proc uses ax cx dx
mov cx,16
mov ax,dx
xor dx,dx
d: rol ax,1
adc dl,0
push ax
add dl,30h
mov ah,2
int 21h
xor dx,dx
pop ax
loop d
ret
dispbin endp
;
code ends
end start
水刃木栋 2011-05-24
  • 打赏
  • 举报
回复
二楼的程序start:后第二句mov dx,ax是不是应该改为mov ds,ax
Jackindata 2011-05-23
  • 打赏
  • 举报
回复
程序还没有考虑输入是字母的情况。
这个程序编译通过,但是输出几乎都是0(16个),输入8跟9都是输出1000。

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧