Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何对汇编中的两个十六进制数求和_Assembly_X86_Hex - Fatal编程技术网

Assembly 如何对汇编中的两个十六进制数求和

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

我试图对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

正如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
Proc
mostrarnum
首先通过提取具有连续除法的数字将数字转换为十六进制。这些数字存储在堆栈中,使用
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
Proc
mostrarnum
首先通过提取具有连续除法的数字将数字转换为十六进制。这些数字存储在堆栈中,使用
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)。另外,一定要使用,否则你的哭声将是徒劳的。