如何将HEX转换为DECIMAL?

时间:2011-10-22 22:40:09

标签: assembly tasm

我计划将X变量转换为十进制。我在使用turbo汇编器时遇到了困难,你能帮忙吗?

code segment     ;inicio de un segmento unico
assume cs:code,ds:code,ss:code
org 100h       ;localidad de inicio del contador
main  proc     ;procedimiento principal

mov ax,cs
mov ds,ax   ; INICIO 

mov ax, x

mov ah,4ch ;comienzo del fin de programa
int 21h    ;fin del programa

main endp

x dw 0A92FH

code ends   ; fin del segmento de codigo
end main    ;fin del ensamble

非常感谢

1 个答案:

答案 0 :(得分:8)

将数字转换为可打印格式时,通常最容易从最后一位开始。

考虑将123转换为“123”,我们如何获得最后一位数字?它除以10(基数)时保留。所以123%10给我们3和123/10 = 12方便地给我们在下一次迭代中使用的正确数字。在x86上,“DIV”指令很好地为我们提供了商和余数(分别在axdx中)。剩下的就是在字符串中存储可打印的字符。

将所有这些放在一起你得到的结果如下(使用nasm语法):

; ConvertNumber
;   Input:
;     ax = Number to be converted
;     bx = Base
;   
;   Output:
;     si = Start of NUL-terminated buffer
;          containing the converted number
;          in ASCII represention.

ConvertNumber:
    push ax            ; Save modified registers
    push bx
    push dx
    mov si, bufferend  ; Start at the end
.convert:
    xor dx, dx         ; Clear dx for division
    div bx             ; Divide by base
    add dl, '0'        ; Convert to printable char
    cmp dl, '9'        ; Hex digit?
    jbe .store         ; No. Store it
    add dl, 'A'-'0'-10 ; Adjust hex digit
.store:
    dec si             ; Move back one position
    mov [si], dl       ; Store converted digit
    and ax, ax         ; Division result 0?
    jnz .convert       ; No. Still digits to convert
    pop dx             ; Restore modified registers
    pop bx
    pop ax
    ret

这需要一个工作缓冲区(16表示base = 2时的情况和NUL终结符的额外字节):

buffer: times 16 db 0
bufferend:
    db 0

添加对已签名号码的支持留给读者练习。 Here大致相同,适用于64位汇编。