从键盘输入一个2位无符号的16进制数,00h~ffh,然后在显示器上同时以2进制和16进制显示出来 用汇编语言写

2024-11-01 09:27:09
推荐回答(2个)
回答(1):

;从键盘输入一个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

回答(2):

你是哪位~~~谢谢你哈,今天我们也在做这个实验~~~~悠嘻