assembly - spiderman - tasm marvel
¿Cómo puedo convertir HEX en DECIMAL? (1)
Al convertir números en un formato imprimible, a menudo es más fácil comenzar con el último dígito.
Considere la posibilidad de convertir 123 a "123", ¿cómo obtendríamos el último dígito? Es lo que queda cuando se divide por 10 (la base). Entonces el 123% 10 nos da 3 y 123/10 = 12 nos da el número correcto para trabajar en la próxima iteración. En x86, la instrucción "DIV" es lo suficientemente buena para darnos tanto el cociente como el resto (en ax
y dx
respectivamente). Lo único que queda es almacenar caracteres imprimibles en la cadena.
Al juntar todo esto, terminas con algo como lo siguiente (usando la sintaxis de 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
Esto requiere un buffer de trabajo (16 para el caso cuando base = 2 y un byte extra para el terminador NUL):
buffer: times 16 db 0
bufferend:
db 0
Agregar soporte para números con signo se deja como un ejercicio para el lector. Aquí está más o menos la misma rutina adaptada para el ensamblaje de 64 bits.
Planeo convertir la variable X a decimal. Estoy teniendo problemas para usar el ensamblador de turbo, ¿puedes ayudarme?
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
Muchas gracias