如何在装配中求和两个十六进制数

时间:2016-07-05 03:56:12

标签: assembly x86 hex

我想在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

1 个答案:

答案 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