Hola :D gracias por las repuestas a esta pregunta :)
Tengo el siguiente código de ensamblador nasm que no funciona :-\ pero no se porque:
%include "io.inc"
%macro print 1
%%msg2 dw 12 ; esta la linea del error :(
push eax
push ecx
mov eax, %1
mov ecx, -1
while:
add ecx, 1
cmp byte [eax+ecx], 0
jmp PRINT_CHAR [eax+ecx]
jne while
pop ecx
pop eax
%endmacro
section .data
msg db "Hola", 13, 0
section .text
global CMAIN
CMAIN:
xor eax, eax
print msg
ret 0
Mi intención con esto es crear una variable en una macro para usarla en un bucle, esta en una macro que imprime caracteres para que sepa si funciona o no ;D pero no funciona :(, si cambio el valor de 12 a 500 o 250, se traba el programa y no ejecuta :(, tambien si uso algo como;
%%msg2 db "Hola mundo"
No funciona
Gracias por las respuestas :)
Edit:
Logre hacerlo funcionar con el siguiente codigo:
%macro print 1
section .data
msg2 db "Hola mundo";
section .text
push eax
push ecx
mov eax, %1
mov ecx, -1
while:
add ecx, 1
cmp byte [eax+ecx], 0
jmp PRINT_CHAR [eax+ecx]
jne while
pop ecx
pop eax
%endmacro
No funciona correctamente, a mi me imprime la siguiente cadena: " ola". ¿A que se debe esto? A que en el bucle primero haces la comparacion, despues el PRINT_CHAR y finalmente el salto a while o no asi que cuando llega al 0 terminador tambien lo escribe y como antes se encontro con un retorno de carro (https://en.wikipedia.org/wiki/Carriage_return) (\r = 13) volvio al principio de la linea.
PD. ¿Que funcion cumple msg2 exactamente?
msg2 es una variable de ejemplo que quiero utilizar para imprimir un Hola mundo
Ejemplo:
%macro printHelloWorld 0
section .data
msg db "Hola mundo", 0
section .text
push ecx
mov ecx, -1
while:
add ecx, 1
cmp byte [msg +ecx], 0
jmp PRINT_CHAR [msg +ecx]
jne while
pop ecx
%endmacro
section .text
global CMAIN
CMAIN:
xor eax, eax
printHelloWorld
ret 0
Si bueno, con tantas versiones es imposible no perderse, en el codigo que yo cite msg2 era irrelevante.