Преобразование десятичного числа в шестнадцатеричное - PullRequest
6 голосов
/ 04 апреля 2011

Прежде всего, это домашнее задание.

Я пытаюсь прочитать 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

1 Ответ

4 голосов
/ 04 апреля 2011

При использовании кода операции MUL возможны три разных результата:

  • 8 бит - результаты сохраняются в ax
  • 16 бит - результаты сохраняются в dx: ax
  • 32 бита - результаты сохраняются в формате edx: eax

Поэтому, когда вы выполняете умножение, инструкция перезаписывает dx на ноль в вашем случае.Это означает, что каждое последующее использование кода операции умножается на ноль.

...