如何在masm 8086中除以十六进制数以获得余数?

时间:2015-11-14 16:53:51

标签: assembly hex masm x86-16 divide

我想将十六进制数转换为相应的ASCII。为此,我需要从输入中获取每个数字并转换为相应的ASCII。我知道这可以用十进制来完成,只需要将余数分成几小部分,但我在十六进制中遇到问题。任何帮助?

1 个答案:

答案 0 :(得分:1)

对于十进制,你可以重复除以所需的基数,这是16。问题是,你不能轻易得到十六进制字符,因为ASCII表在这一点上不是连续的:

  

'0'=> 30H
  ...
  '9'=> 39H

  的 GAP

  'A'=> 41H
  ...
  'F'=> 46H

获得例如其余10中的'A',你必须在之后添加7 转换为ASCII。例如:

.MODEL small
.STACK 1000h

.DATA

    number dw 09A8Fh
    hexstring db 4 DUP (?)
    last_hex EQU ($ - 1)
    terminator db '$'

.CODE

main PROC
    mov ax, @data
    mov ds, ax

    mov cx, 16              ; Base 16 (hexadecimal)
    mov di, last_hex
    mov ax, number

    L1:
    xor dx, dx              ; Don't forget it!
    div cx
    or dl, 30h              ; Convert remainder to ASCII
    cmp dl, '9'
    jbe @F                  ; Jump to next @@
    add dl, 7               ; Adjust ASCII
    @@:
    mov [di], dl            ; Store ASCII
    dec di                  ; Move DI backwards
    test ax, ax             ; AX == 0?
    jne L1                  ; No: once more

    lea dx, hexstring
    mov ah, 9
    int 21h

    mov ax, 4C00h
    int 21h
main ENDP

END main