Variables macros de NASM

Iniciado por alienxz77b, 20 Octubre 2021, 02:26 AM

0 Miembros y 2 Visitantes están viendo este tema.

alienxz77b

Hola  :D gracias por las repuestas a esta pregunta :)
Tengo el siguiente código de ensamblador nasm que no funciona  :-\ pero no se porque:
Código (asm) [Seleccionar]

%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;
Código (asm) [Seleccionar]
%%msg2 db "Hola mundo"
No funciona
Gracias por las respuestas :)
Edit:
Logre hacerlo funcionar con el siguiente codigo:
Código (asm) [Seleccionar]

%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

Eternal Idol

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 (\r = 13) volvio al principio de la linea.


PD. ¿Que funcion cumple msg2 exactamente?
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

alienxz77b

msg2 es una variable de ejemplo que quiero utilizar para imprimir un Hola mundo
Ejemplo:
Código (asm) [Seleccionar]


%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

Eternal Idol

Si bueno, con tantas versiones es imposible no perderse, en el codigo que yo cite msg2 era irrelevante.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón