汇编语言(九)之十六进制数值转二进制
输入四位十六进制的数值,将十六进制数值转二进制输出程序运行:代码:datas segmentmaxLengthdb 5hexLengthdb 0hexdb 5 dup(?)bin...
·
输入四位十六进制的数值,将十六进制数值转二进制输出
程序运行:
代码:
datas segment
maxLength db 5
hexLength db 0
hex db 5 dup(?)
bin db 100h dup(?)
inputPrompt db 'input 4 bit hexadecimal:$'
outputBinary db 0dh,0ah,'output binary:$'
outputInputError db 0dh,0ah,'input error!$'
datas ends
stacks segment stack
db 100h dup(?)
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks
main proc far
start:
push ds
mov ax,0h
push ax
mov ax,datas ;初始化ds
mov ds,ax
lea dx,inputPrompt ;输入提示
mov ah,9
int 21h
lea dx,maxLength ;输入十六进制字符
mov ah,10
int 21h
mov cl,hexLength ;若字符串长度不为4,则输入错误
cmp cl,4
jne inputError
mov ch,0 ;设置ch,使得cx为字符串的长度
lea si,hex
lea di,bin
s:
mov al,[si]
cmp al,'9' ;判断字符是否大于'9'
ja english ;大于9则跳转去判断是否为其他十六进制字符
cmp al,'0' ;判断字符是否大于'0'
jb inputError ;若小于'0',则输出
jmp tobinary ;否则,则转换为二进制
english:
or al,32 ;将字符变成小写字母,不是小写字母的运算结果不变
cmp al,'a' ;判断字符是否大于'a'
jb inputError ;若小于'a',则输入错误
cmp al,'f' ;判断字符是否大于'f'
ja inputError ;若大于'f',则输入错误
sub al,7 ;先减7,变成数字的值+30h
tobinary:
sub al,30h ;减去30h,剩下数值
call binary ;转换二进制,使用al,di
inc si ;数组下标加一
loop s
lea dx,outputBinary ;输出二进制提示
mov ah,9
int 21h
mov byte ptr [di],'$' ;设置二进制字符串的结束字符
lea dx,bin ;输出二进制字符串
mov ah,9
int 21h
jmp exit
inputError: ;输入错误提示
lea dx,outputInputError
mov ah,9
int 21h
exit:
ret
main endp
binary proc near
push cx ;保存cx
mov cl,4 ;将al左移4位,使al的高半字节为原来al的低半字节
shl al,cl
mov cx,4
sbin:
shl al,1 ;左移一位
jc one ;进位为1,跳转到one
mov byte ptr [di],'0' ;否则,二进制数组置'0'
jmp restart ;跳转到restart
one: ;置'1'
mov byte ptr [di],'1'
restart:
add di,1
loop sbin
pop cx ;恢复cx
ret
binary endp
codes ends
end main
更多推荐
所有评论(0)