汇编程序求教

2025-12-15 17:58:37
推荐回答(1个)
回答1:

1、这题用16位程序就可以完成了
code segment
assume cs:code
start:
xor bx,bx ;初始化寄存器bx
mov cx,404h ;高8位用来计数,低8位存放位移位数
ls_in:
shl bx,cl ;bx向左移4位
lp_in:
mov ah,8h ;8号中断-输入一个字符,不回显
int 21h

cmp al,08h ;判断是不是退格键
jz bs_in

jmp if_in ;不是的话,跳转
bs_in: ;如果是退格键的话
cmp ch,4
jge lp_in ;没有可以删除的数字,跳回

mov ah,2h
mov dl,al
int 21h
mov dl,20h
int 21h
mov dl,08h
int 21h ;清除上一个字符

inc ch
shr bx,cl
and bl,0f0h ;bl最后4位清零
jmp lp_in

if_in: ;判断输入的字符是否合法(0-9或a-f)
cmp al,30h
jl lp_in
cmp al,66h
jg lp_in
cmp al,39h
jle do_in
cmp al,61h
jge do_in

jmp lp_in

do_in:
mov ah,2
mov dl,al
int 21h ;把输入的字符显示出来,因为使用的是不回显中断
cmp al,61h
jl next1_in ;如果输入的是0-9,跳转
sub al,'a'
add al,0ah ;转换成16进制对应的数字
jmp next2_in
next1_in:
sub al,'0' ;把Asc码转换成对应数字0-9
next2_in:
or bl,al ;把结果填入bx最后4位

dec ch ;ch自减
cmp ch,0 ;判断是否循环结束
jg ls_in

mov dx,bx

mov ah,4ch
int 21h
code ends
end start

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

2、这道题牵扯到eax就是32位汇编了
对32位汇编不熟悉,做不来这题,先给个16位的按16进制显示BX寄存器值的子程序吧

;显示16进制数
;入口:bx
;出口:无
printH proc near
push dx
push cx
push ax
mov cx,404h
lp_print:
rol bx,cl ;bx中数字向左循环移4位
mov al,bl
and al,0fh
cmp al,0ah ;判断al中数字与10的大小关系
jl next_print
add al,7 ;大于等于10的话先+7
next_print:
add al,'0' ;把数字0-9转换成对应Asc码
mov dl,al
mov ah,2
int 21h ;显示出来

dec ch ;ch自减1
cmp ch,0
ja lp_print

pop ax
pop cx
pop dx
ret
printH endp