;从键盘输入一个2位无符号的16进制数,00h~ffh,然后在显示器上同时以2进制和16进制显示出来 用汇
编语言写
;类似的题目有许多种做法,这次换了种方法...
;用MASM 5.0 编译通过。(CTRL+C结束)
;运行结果示范如下:
;aa ====>>> 10101010
;bb ====>>> 10111011
;cc ====>>> 11001100
;dd ====>>> 11011101
;ee ====>>>滑坦 11101110
;ff ====>>> 11111111
;af ====>>> 10101111
;^C
data segment
crlf db 0dh,0ah,'$' ;输出回车换行
f1 db 0 ;定义输入的数字位数标志,为0表示输入的是个位
temp db 0 ;输入的数
mess1 db ' ====>>> $'
s1 db '0123456789ABCDEFabcdef'
LL EQU $-S1
data ends
code segment
assume cs:code, ds:data
main proc far
start:
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
PUSH DS
POP ES
;-------------------------
ini: ;初始化
mov al,0
mov f1,al
mov temp,al
n1: ;输入字符起始位
mov ah,8
int 21h
cmp al,0dh ;是回车符则输出结果
jnz goon
mov bl,temp
jmp output
goon:
CALL C_1 ;检测输入字符是否合法
JNZ N1 ;不饥缺合法,直接重新输入
PUSH AX ;显示输入的字符
MOV DL,AL
MOV AH,2
INT 21H
pop ax
cmp al,'a' ;以下将输入的字符转换成数字
jb be1a
sub al,'a'-10
jmp nn1
be1a:
cmp al,'A'
jb be1
sub al,'A'-10
jmp nn1
be1:
sub al,'0'
nn1:
mov bl,f1 ;检测输入的是1位还是2位
cmp bl,0
jnz w2
mov temp,al ;是1位
inc f1 ;置1位标志
jmp n1 ;跳转输入下一个数位
w2: ;输入的是第2位数
mov bl,temp ;将上一位输入的数乘以10H(左移4位),再加上这次输入的数
mov cl,4
shl bl,cl
add bl,al
output: ;将数字输出提示信息,烂让辩'====>>>'
mov ah,9
mov dx,offset mess1
int 21h
mov cl,8 ;设置循环次数
disp_n:
rol bl,1 ;左移一位
jc dd1
mov dl,'0' ;无进位显示0
jmp disp
dd1:
mov dl,'1' ;有进位显示1
disp:
mov ah,2
int 21h
loop disp_n
mov ah,9
mov dx,offset crlf ;输出一个回车换行
int 21h
jmp ini ;跳转输入下一个数
main endp
;==================
C_1 PROC NEAR ;检测输入的字符是否合法子程序
MOV DI,OFFSET S1
MOV CX,LL
REPNZ SCASB
ret
;返回:NZ=输入的值不在表内 ZR=输入的值在表内
C_1 ENDP
;===========
code ends
end start
你是哪位~~~谢谢你哈,今天我们也在做这个实验~~~~悠嘻