Como puedo hacer que este código ensamblador funcione?

Iniciado por alienxz77b, 18 Octubre 2021, 08:00 AM

0 Miembros y 1 Visitante están viendo este tema.

alienxz77b

Hola :), primero gracias por tomarse el tiempo para leer esta pregunta  ;D

Tengo este código ensamblador de NASM que realice para probar una teoría de condicionales
el chiste es que no puedo hacerlo correr debido a un problema que me sale:
Código (mpasm) [Seleccionar]
%include "io.inc"
%macro print 1
   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
%macro strcpy 2
   push eax
   push ecx
   push edx
   mov eax, %1
   mov edx, %2
   mov ecx, -1
   .while:
   add ecx, 1
   cmp byte [eax+ecx], 0
   mov [edx+ecx], byte [eax+1]; al parecer en esta linea de codigo esta el error  :-[
   jne .while
   je print edx
   pop edx
   pop ecx
   pop eax
%endmacro
;segment data
section .data
msg db "Hola", 13, 0
msg2 db "     ", 0
section .text
global CMAIN
CMAIN:
   xor eax, eax
   call strcpy msg, msg2
   ret 0

Error:

C:\Users\Windows\AppData\Local\Temp\SASM\program.asm:40: error: invalid combination of opcode and operands
gcc.exe: error: C:\Users\Windows\AppData\Local\Temp\SASM\program.o: No such file or directory


No se que hacer para solucionarlo, programo en windows bajo el IDE de SASM
Agradezco toda la ayuda  ;D
Edit:
En la linea 25 era:
Código (asm) [Seleccionar]
    mov [edx+ecx], byte [eax+ecx]; al parecer en esta linea de codigo esta el error  :-[
:xD

Usuario887

#1
Cita de: alienxz77b en 18 Octubre 2021, 08:00 AM
C:\Users\Windows\AppData\Local\Temp\SASM\program.asm:40: error: invalid combination of opcode and operands

Estas usando la sintaxis de invoke:

https://docs.microsoft.com/en-us/cpp/assembler/masm/invoke?view=msvc-160

Mas informacion sobre la dicotomia entre call e invoke:

http://www.asmcommunity.net/forums/topic/?id=29146

En la linea cuarenta.

Eso traducido a un call corriente con una convencion de llamada de C:

https://en.wikipedia.org/wiki/X86_calling_conventions

Seria:

Citar
push addr msg2
push addr msg
call strcpy

Deberia funcionar, aunque no lo probe.
Suerte.  :-*




PD:

Si quisieras usar invoke:

Citar
invoke strcpy msg, msg2

alienxz77b

Hola gracias por responder  ;D, al parecer sigue tirando el mismo error  :-\

Eternal Idol

Si, el mov de la linea 25 no es factible pero te recomiendo revisar y depurar todo, no encuentro el sentido a usar eax + 1 en cada iteracion (eso en este caso copia el segundo caracter de una cadena siempre).

Esto es equivalente a lo que intentabas:
Código (asm) [Seleccionar]
mov bl, [eax+1]
mov [edx+ecx], bl



PD. invertiste el orden de los parametros de strcpy, el primero deberia ser el destino y el segundo la fuente.
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

Ya arregle el código  :D:
Código (asm) [Seleccionar]
%include "io.inc"
%macro print 1
    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
%macro strcpy 2
    push eax
    push ecx
    push edx
    push SI
    mov edx, %1
    mov eax, %2
    mov ecx, -1
    .while:
    add ecx, 1
    cmp byte [eax+ecx], 0
    mov SI, [eax+ecx]
    mov [edx+ecx], SI
    jne .while
    pop SI
    pop edx
    pop ecx
    pop eax
%endmacro
;segment data
section .data
msg db "Hola", 13, 0
section .bss
msg2 resb 100
section .text
global CMAIN
CMAIN:
    xor eax, eax
    strcpy msg2, msg
    print msg2
    ret 0

Gracias por su ayuda  a todos los que respondieron ;D
Nos vemos  ;)

Eternal Idol

Bien, ahora tiene logica la copia pero sigue teniendo exactamente el mismo bug que en el otro hilo al escribir con print y es opuesto al standard de C el strcpy.
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

Según Wikipedia:
https://es.wikipedia.org/wiki/Strcpy
La sintaxis de strcopy esta bien  ;D
Codigo sin bugs o algo parecido (puede que tenga errores  :()
Código (asm) [Seleccionar]
%include "io.inc"
%macro print 1
    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
%macro strcpy 2
    push eax
    push ecx
    push edx
    push SI
    mov edx, %1
    mov eax, %2
    mov ecx, -1
    .while:
    add ecx, 1
    cmp byte [eax+ecx], 0
    mov SI, [eax+ecx]
    mov [edx+ecx], SI
    jne .while
    pop SI
    pop edx
    pop ecx
    pop eax
%endmacro
;segment data
section .data
msg db "Hola", 0
section .bss
msg2 resb 100
section .text
global CMAIN
CMAIN:
    xor eax, eax
    strcpy msg2, msg
    print msg2
    ret 0

Eternal Idol

Mala mia, lo cambiaste y ahora si el primer parametro es el destino y el segundo la fuente, el bug del print sigue ahi, escribe el 0 terminador.
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

De hecho solo se pueden imprimir cadenas usando el terminador nulo como en C  ;D

Eternal Idol

#9
No, una cosa es ENCONTRARLO para frenar y otra muy diferente escribir el 0, eso hace tu codigo y ninguna funcion para escribir una cadena en pantalla lo hace  ;) ¿Para que le sacaste el 13 a msg?  ;D ;D ;D ¿Para que no pasara esto?



¿Crees que si llamo a printf con "Hola\r" como parametro pasa eso acaso? Necesitaria llamar a putc con el 0 para que lo escribiera y pasara lo mismo que con tu macro print.

PD. Si se puede. char nnts[] = { 'N', 'E', 'W', 'B', 'I', 'E', 0xCC, 0xCC };
printf("%.*s", 6, nnts);
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