Trabajando con operaciones que involucren cifras numéricas en ensamblador, queremos escribir los resultados ya sea en la consola o en un archivo, y aquí es donde este macro me ha sacado la tarea.
¿Hay alguna condición para imprimir los números?
Podemos trabajar con la base que queramos, porque el compilador lo convierte a una misma base según la operación que realicemos.
¿Qué necesita el macro?
Este macro necesita la reserva de memoria para los dígitos ASCII del número a escribir
res db 4 dup('$')
A sí mismo, se puede declarar de un número como el siguiente:
number db 58Como también enviar el número a través de uno de los registros o directamente
Nemónimos a utilizar
- MOV destino, fuente: Transfiere el valor del registro fuente hacia el registro destino.
- DIV divisor: Realiza la división aritmética del registro AX entre el registro que se envía. este nemónimo utiliza el registro DX para almacenar el residuo, por lo que este debería ser 0 antes de ejecutar la operación.
- ADD destino, fuente: Realiza la suma aritmética sin acarreo del registro destino y el registro fuente, el resultado lo almacena en el registro destino.
- PUSH registro: Agrega el registro a la pila.
- POP registro: Extrae el valor de la cima de la pila y lo almacena en el registro dado.
- INC registro: Incrementa uno el registro enviado.
- CMP destino, fuente: Realiza una comparación aritmética entre el registro destino y el registro fuente, llenando las banderas CF, ZF, OF, SF y PF.
- JA punto: Realiza un salto condicional a la dirección definida sii el registro destino es mayor al registro fuente en la comparación anterior.
Macro utilizado
numAscii MACRO num
LOCAL extractDig, convertDig
mov ax, num
mov cx, 0
mov bx, 10
extractDig:
mov dx, 0
div bx
push dx
inc cx
cmp ax, 9
ja extractDig
inc cx
mov bx, 0
convertDig:
add al, 30h
mov res + bx, al
pop ax
inc bx
LOOP convertDig
mov res + bx, '$'
ENDM
Ejemplo
Este y más ejemplos de macros lo tengo en mi GitHub. Entra aquí
Comentarios