Assembly 如何对汇编中的两个十六进制数求和
我试图对x8086汇编中的两个十六进制数求和,每个十六进制数有一个数字。我知道如何对小数求和。有人能告诉我怎么做吗?这是我的密码:Assembly 如何对汇编中的两个十六进制数求和,assembly,x86,hex,Assembly,X86,Hex,我试图对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 mostrar
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
正如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
Procmostrarnum
首先通过提取具有连续除法的数字将数字转换为十六进制。这些数字存储在堆栈中,使用push
。最后,从堆栈中检索并显示数字。这是必要的,因为分割以相反的顺序生成数字,通过推动堆栈中的数字,它们会再次反转,因此,当它们出来时,它们的顺序是正常的
数字的加法不关心基数(二进制、十进制、十六进制等),正如德韦尔奇所说,数字只是位,是你,作为人类,决定这些位是十六进制还是十进制,等等。示例:
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将得到。。。基数14。正如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
Procmostrarnum
首先通过提取具有连续除法的数字将数字转换为十六进制。这些数字存储在堆栈中,使用push
。最后,从堆栈中检索并显示数字。这是必要的,因为分割以相反的顺序生成数字,通过推动堆栈中的数字,它们会再次反转,因此,当它们出来时,它们的顺序是正常的
数字的加法不关心基数(二进制、十进制、十六进制等),正如德韦尔奇所说,数字只是位,是你,作为人类,决定这些位是十六进制还是十进制,等等。示例:
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将得到。。。基址14。寄存器保留位,基址2。十六进制是以16为基数直接翻译的,以10为基数根本不翻译,汇编程序必须为您将其转换为二进制。就像你使用十六进制数一样,它会为你翻译。你知道如何做一个你知道如何做另一个。你真的写了那段代码吗?如果我有一个BCD或二进制的数字,我怎么用十六进制表示它?数字没有基。使用ASCII表转换十六进制数字,具体来说,数字0-9与十进制相同,对于a-f,您需要添加不同的偏移量(不超过30h)。另外,一定要使用,否则你的哭声将无效。寄存器保留位,基数2。十六进制是以16为基数直接翻译的,以10为基数根本不翻译,汇编程序必须为您将其转换为二进制。就像你使用十六进制数一样,它会为你翻译。你知道如何做一个你知道如何做另一个。你真的写了那段代码吗?如果我有一个BCD或二进制的数字,我怎么用十六进制表示它?数字没有基。使用ASCII表转换十六进制数字,具体来说,数字0-9与十进制相同,对于a-f,您需要添加不同的偏移量(不超过30h)。另外,一定要使用,否则你的哭声将是徒劳的。