📄 计算和.asm
字号:
;从键盘输入两个十六进制数(长度小于4),计算它们的和然后输出
;如输入的两个数为1111,abcd,则显示结果为
;1111+abcd=bcde
data segment
X dw ?
Y dw ?
note db 0ah,0dh,'please input a number [0,9]or[A,F](length <=4)','$'
data ends
stack segment stack
db 100 dup(?)
stack ends
code segment
assume cs:code, ds:data, ss:stack
start: mov ax,data
mov ds,ax
mov dx,offset note
mov ah,09h
int 21h
call input16
mov X,ax
mov dx,offset note
mov ah,09h
int 21h
call input16
mov Y,ax
call outputenter
mov ax,X
call output16
mov ah,02h
mov dl,'+'
int 21h
mov ax,Y
call output16
mov ah,02h
mov dl,'='
int 21h
mov ax,X
add ax,Y
call output16
mov ah,4ch
int 21h
input16 proc
;从键盘读十进制数据,输入数据不在[0,9][A,F]时结束
;转换好的数据存放在AX中
push bx
push si
mov cl,0;记录符号
mov bx,0
next: mov ah,01h
int 21h
cmp al,'0'
jb done
cmp al,'9'
jbe rightinput10
cmp al,'A'
jb done
cmp al,'F'
jbe rightinput16
cmp al,'a'
jb done
cmp al,'f'
jbe rightinput16
jmp done
rightinput10: and al, 0fh
jmp endextract
rightinput16:
and al,0fh;‘A’的ASCII为41h,该指令的运算结果为01h,期望是0Ah,所以加9
add al,9
endextract:
mov ah,0
xchg bx,ax
mov si,16
mul si
add bx,ax
jmp next
done: mov ax,bx
pop si
pop bx
ret
input16 endp
output16 proc
;将AX中的数据按十六进制格式输出
push dx
push cx
push bx
push ax
mov bx,ax;BX中保留待转换的数
mov cl,4;每次需要移4位
mov ch,4;共有4位16进制数要输出
next16: rol bx,cl
mov dx,bx
and dl,0fh
cmp dl,9
jg tochar16
add dl,30h
jmp endchange
tochar16: add dl,41h-10
endchange:
mov ah,02h
int 21h
dec ch
jnz next16
pop ax
pop bx
pop cx
pop dx
ret
output16 endp
outputenter proc
;输出回车和换行
push dx
push ax
mov ah,02h
mov dl,0ah
int 21h
mov ah,02h
mov dl,0dh
int 21h
pop ax
pop dx
ret
outputenter endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -