【问题标题】:Converting Decimal to Hex将十进制转换为十六进制
【发布时间】:2011-07-28 20:01:55
【问题描述】:

首先,这是家庭作业。

我正在尝试将一个 5 位数字读入寄存器 bx。假定该数字不大于 65535(16 位)。以下是我尝试这样做的方式。

但是,当我尝试打印数字时,我只打印输入的最后一个数字。这让我猜测,当我向 bx 添加另一个数字时,它会覆盖以前的数字,但我看不到问题所在。任何帮助将不胜感激,我几乎可以肯定这是我忽略的小东西:-/

mov cx,0x05 ; loop 5 times
    mov bx,0    ; clear the register we are going to store our result in
    mov dx,10   ; set our divisor to 10

read:
    mov ah,0x01     ; read a character function
    int 0x21        ; store the character in al
    sub al,0x30     ; convert ascii number to its decimal equivalent
    and ax,0x000F   ; set higher bits of ax to 0, so we are left with the decimal
    push ax         ; store the number on the stack, this is the single digit that was typed
    ; at this point we have read the char, converted it to decimal, and pushed it onto the stack
    mov ax,bx       ; move our total into ax
    mul dx          ; multiply our total by 10, to shift it right 1
    pop bx          ; pop our single digit into bx
    add bx,ax       ; add our total to bx
    loop read       ; read another char

【问题讨论】:

  • 如果您将十进制转换为十六进制,那么您为什么要除以 10?转换为十六进制时,您不需要乘/除以 10
  • 在我发布的 sn-p 中,我看不到在哪里除以 10。但我乘以 10 的原因是因为我一次只能读取 1 个字符,我需要将它乘以 10,这样当我添加另一个数字时,它就在适当的位置.
  • +1 用于发布家庭作业问题并展示您已经尝试过的内容。
  • 对不起,我的错..我没有你的环境(汇编程序)你能发布一些你得到的结果吗?

标签: assembly nasm multiplication


【解决方案1】:

使用 MUL 操作码时,会出现三种不同的结果:

  • 8 位 - 结果存储在 ax 中
  • 16 位 - 结果存储在 dx:ax 中
  • 32 位 - 结果存储在 edx:eax

因此,当您执行乘法时,在您的情况下,指令会用零覆盖 dx。这意味着 mul 操作码的每次后续使用都会乘以零。

【讨论】:

  • 非常感谢,1 行,它运行良好。我没有想到 dx 被 0 覆盖了,我认为它会保持相同的值。
  • 请记住,当您只反向使用 div 操作码时,也会发生同样的事情。