【问题标题】:How to Sum Two Hex Numbers in Assembly如何在汇编中对两个十六进制数求和
【发布时间】:2016-07-05 03:56:11
【问题描述】:

我正在尝试将 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

【问题讨论】:

  • 寄存器保存位,基数 2。十六进制是基数 16,直接转换基数 10 根本不转换,汇编器必须为您将其转换为二进制。就像您使用十六进制数字一样,它会为您翻译。你知道如何做一个,你知道如何做另一个。
  • 你真的写了那个代码吗?
  • 如果我有一个 BCD 或二进制数字,如何以十六进制显示?
  • 数字没有底,numerals have。使用ASCII表转换十六进制数字数字,具体数字0-9与十进制相同,为a-f您需要添加不同的偏移量(不再是 30 小时)。另外,请务必使用comment replies,否则您的哭泣将是徒劳的。

标签: assembly x86 hex


【解决方案1】:

正如 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 将得到...基数 14 .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2014-04-08
    • 2012-03-10
    • 2019-05-16
    • 2015-10-01
    相关资源
    最近更新 更多