托马斯儿歌中文版:二进制转换成十进制的程序

来源:百度文库 编辑:高考问答 时间:2024/04/29 18:53:00
要用汇编语言编写,8086 CPU系统

name change2BTo10D
;数据段
data segment
outNum db ?;输出数字
msgInput db 'please input the num end with B or b or enter.',0ah,0dh,'[eg:101B]:$'
msgEnd db 0ah,0dh,'press any key to end ...$'
data ends

;代码段
code segment
assume ds:data,cs:code;,es:data

;回车子程序
enter proc
mov dl,0ah
mov ah,2
int 21h

mov dl,0dh
mov ah,2
int 21h

ret
enter endp

;输出提示子程序dx
msg proc
mov ah,9
int 21h
ret
msg endp

;输出十进制子程序dl
out10B proc
add dl,30h
mov ah,2
int 21h
ret
out10B endp

;检查输入al cl=0 失败
check proc
mov cl,0
cmp al,'0'
jb back
cmp al,'1'
ja back
mov cl,1
back: ret
check endp

;变化处理子程序
Do2to10 proc
mov cl,0
cmp outNum,40h ;0100 0000将溢出7位
ja Dback
shl outNum,1
add outNum,al
mov cl,1
Dback: ret
Do2to10 endp

;输出自程序 outNum<=127
cout proc

mov cl,0 ;计数
mov bl,0 ;下一位十位是否显示
L100: cmp outNum,100
jb L100Nt ;<100
add cl,1
mov bl,1
sub outNum,100
jmp L100

L100Nt: cmp cl,0
je L10

mov dl,cl ;输出百位
mov cl,0 ;清计数
call out10B

L10: cmp outNum,10
jb L10Nt ;<10
add cl,1
mov bl,1
sub outNum,10
jmp L10

L10Nt: cmp bl,1
je L10out ;如果百位有则输出十位

cmp cl,0
je L1

L10out: mov dl,cl ;输出十位
mov cl,0 ;清计数
call out10B

L1: mov dl,outNum ;输出个位
call out10B

ret
cout endp

;输入子程序
input proc
again: mov al,0
mov ah,1 ;输入的是 ASII
int 21h

cmp al,'B' ;结束输入
je inRet
cmp al,'b'
je inRet
cmp al,13
je inRet

call check ;检查输入
cmp cl,0
je backsk ;cl=0失败 忽略当前输入字符

sub al,30h ;结果变成数字
call Do2to10
cmp cl,1
je again ;cl=1 合法且没有结束 下一个输入

inRet: ret
backsk :mov dl,08h
mov ah,2
int 21h
jmp again
input endp

;主程序
main: mov ax,data ;装载数据
mov ds,ax
mov ax,0

lea dx,msgInput
call msg
mov outNum,0
call input
call enter
call cout

lea dx,msgEnd ;退出
call msg
mov ah,1
int 21h

mov ah,4ch
int 21h
code ends
end main
;输入的数必须不大于1111 1111 ==>不大于127
;写了久才写好,都忘得差不多了,希望你喜欢,同时谢谢你的问题
;运行结果
;please input the num end with B or b or enter
;[eg:101B]:1111
;15
;press any key to end ...

用C写了,然后编译成汇编
呵呵,偶当年就是这么做的