当前位置:编程学习 > 汇编语言 >>

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

答案:;从键盘输入一个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位无符号的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 你是哪位~~~谢谢你哈,今天我们也在做这个实验~~~~悠嘻 

上一个:?!,帮忙详细解释下汇编程序
下一个:学习汇编编程要注意那些!

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,