我想在Assembly x8086中求和两个十六进制数,每个都有一位数。我知道如何将小数加起来。有人可以告诉我该怎么做吗?这是我的代码:
ADD CL, BL ; CL and BL have the one digit numbers
MOV AL, CL
MOV AH, 0
AAA
ADD AX, 3030H
MOV BX, AX
mov dl, bh
call mostrarchar
mov dl, bl
call mostrarchar
int 20H
Nomeprog ENDP
mostrarchar proc near
mov AH, 02h
int 21h
ret
mostrarchar endp
答案 0 :(得分:2)
根据Margaret Bloom的建议,你需要你的proc mostrarchar
来检测数字何时小于或等于9(它是一个数字),当数字大于9时(它是一个字母,10 .. 15 ='A'..'F'),例如:
mov dl, 8
call mostrarchar ;DISPLAY '8'.
mov dl, 15
call mostrarchar ;DISPLAY 'F'.
mostrarchar proc
cmp dl, 9
jbe digit ;IF ( DL <= 9 )
;IT'S A LETTER (10..15 = 'A'..'F').
add dl, 37h ;DL+55.
jmp display ;SKIP "DIGIT:".
digit:
add dl, 30h ;DL+48.
display:
mov ah, 02h
int 21h
ret
mostrarchar endp
以前的代码仅适用于一位数。对于更大的数字,您需要将数字除以基数(在您的情况下,基数为16)几次,直到它变为零,每个余数为一位数,然后您调用mostrarchar
以显示每个十六进制数字,例如:
mov ax, 15729
call mostrarnum ;DISPLAY '3D71'.
mostrarnum proc
;CONVERT NUMBER TO HEX.
mov bp, 16 ;BASE.
mov cx, 0 ;REMAINDERS COUNTER.
divisions:
mov dx, 0
div bp ;DX:AX ÷ 16.
push dx ;PUSH REMAINDER.
inc cx ;COUNT REMAINDER.
cmp ax, 0
jne divisions ;IF ( AX != 0 )
;DISPLAY HEX DIGITS EXTRACTED FROM NUM.
remainders:
pop dx
call mostrarchar ;DISPLAY HEX CHAR.
loop remainders ;CX-1. IF ( CX > 0 ) REPEAT.
ret
mostrarnum endp
Proc mostrarnum
首先通过提取具有连续除法的数字将数字转换为十六进制。这些数字与push
一起存储在堆栈中。最后,从堆栈中检索并显示数字。这是必要的,因为分区以相反的顺序生成数字,通过按下堆栈中的数字它们再次反转,因此,当它们出来时,它们处于正常顺序。
数字的加法不关心基数(二进制,十进制,十六进制等),数字,如dwelch所说,只是位,是你作为人类决定这些位是否为十六进制或十进制等。示例:
mov al, 9 ;DECIMAL.
mov ch, 0Ah ;10
add ch, al ;0Ah + 9 = 13h (19)
mov dl, 01110011b ;BINARY (115, 73h)
add ch, dl ;13h + 115 = 134 (86h)
您可以将最终结果显示为十进制(“134”),十六进制(“86”)或任何其他结果。
顺便说一句,您可以使用相同的技术(给定基数的连续除法)转换为任何基数,例如,除以8将得到八进制,除以14将给出... base 14