elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Como puedo hacer que este código ensamblador funcione?
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Como puedo hacer que este código ensamblador funcione?  (Leído 11,725 veces)
alienxz77b

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Como puedo hacer que este código ensamblador funcione?
« en: 18 Octubre 2021, 08:00 am »

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
  1. %include "io.inc"
  2. %macro print 1
  3.    push eax
  4.    push ecx
  5.    mov eax, %1
  6.    mov ecx, -1
  7.    while:
  8.    add ecx, 1
  9.    cmp byte [eax+ecx], 0
  10.    jmp PRINT_CHAR [eax+ecx]
  11.    jne while
  12.    pop ecx
  13.    pop eax
  14. %endmacro
  15. %macro strcpy 2
  16.    push eax
  17.    push ecx
  18.    push edx
  19.    mov eax, %1
  20.    mov edx, %2
  21.    mov ecx, -1
  22.    .while:
  23.    add ecx, 1
  24.    cmp byte [eax+ecx], 0
  25.    mov [edx+ecx], byte [eax+1]; al parecer en esta linea de codigo esta el error  :-[
  26.    jne .while
  27.    je print edx
  28.    pop edx
  29.    pop ecx
  30.    pop eax
  31. %endmacro
  32. ;segment data
  33. section .data
  34. msg db "Hola", 13, 0
  35. msg2 db "     ", 0
  36. section .text
  37. global CMAIN
  38. CMAIN:
  39.    xor eax, eax
  40.    call strcpy msg, msg2
  41.    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
  1.    mov [edx+ecx], byte [eax+ecx]; al parecer en esta linea de codigo esta el error  :-[
:xD


« Última modificación: 20 Octubre 2021, 06:29 am por alienxz77b » En línea

Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Como puedo hacer que este código ensamblador funcione?
« Respuesta #1 en: 18 Octubre 2021, 17:13 pm »

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


« Última modificación: 18 Octubre 2021, 18:05 pm por marax » En línea

alienxz77b

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: Como puedo hacer que este código ensamblador funcione?
« Respuesta #2 en: 20 Octubre 2021, 02:20 am »

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

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo hacer que este código ensamblador funcione?
« Respuesta #3 en: 20 Octubre 2021, 02:56 am »

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
  1. mov bl, [eax+1]
  2. mov [edx+ecx], bl


PD. invertiste el orden de los parametros de strcpy, el primero deberia ser el destino y el segundo la fuente.
En línea

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

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: Como puedo hacer que este código ensamblador funcione?
« Respuesta #4 en: 20 Octubre 2021, 17:39 pm »

Ya arregle el código  :D:
Código
  1. %include "io.inc"
  2. %macro print 1
  3.    push eax
  4.    push ecx
  5.    mov eax, %1
  6.    mov ecx, -1
  7.    while:
  8.    add ecx, 1
  9.    cmp byte [eax+ecx], 0
  10.    jmp PRINT_CHAR [eax+ecx]
  11.    jne while
  12.    pop ecx
  13.    pop eax
  14. %endmacro
  15. %macro strcpy 2
  16.    push eax
  17.    push ecx
  18.    push edx
  19.    push SI
  20.    mov edx, %1
  21.    mov eax, %2
  22.    mov ecx, -1
  23.    .while:
  24.    add ecx, 1
  25.    cmp byte [eax+ecx], 0
  26.    mov SI, [eax+ecx]
  27.    mov [edx+ecx], SI
  28.    jne .while
  29.    pop SI
  30.    pop edx
  31.    pop ecx
  32.    pop eax
  33. %endmacro
  34. ;segment data
  35. section .data
  36. msg db "Hola", 13, 0
  37. section .bss
  38. msg2 resb 100
  39. section .text
  40. global CMAIN
  41. CMAIN:
  42.    xor eax, eax
  43.    strcpy msg2, msg
  44.    print msg2
  45.    ret 0
Gracias por su ayuda  a todos los que respondieron ;D
Nos vemos  ;)
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo hacer que este código ensamblador funcione?
« Respuesta #5 en: 20 Octubre 2021, 18:35 pm »

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.
En línea

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

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: Como puedo hacer que este código ensamblador funcione?
« Respuesta #6 en: 20 Octubre 2021, 23:24 pm »

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
  1. %include "io.inc"
  2. %macro print 1
  3.    push eax
  4.    push ecx
  5.    mov eax, %1
  6.    mov ecx, -1
  7.    while:
  8.    add ecx, 1
  9.    cmp byte [eax+ecx], 0
  10.    jmp PRINT_CHAR [eax+ecx]
  11.    jne while
  12.    pop ecx
  13.    pop eax
  14. %endmacro
  15. %macro strcpy 2
  16.    push eax
  17.    push ecx
  18.    push edx
  19.    push SI
  20.    mov edx, %1
  21.    mov eax, %2
  22.    mov ecx, -1
  23.    .while:
  24.    add ecx, 1
  25.    cmp byte [eax+ecx], 0
  26.    mov SI, [eax+ecx]
  27.    mov [edx+ecx], SI
  28.    jne .while
  29.    pop SI
  30.    pop edx
  31.    pop ecx
  32.    pop eax
  33. %endmacro
  34. ;segment data
  35. section .data
  36. msg db "Hola", 0
  37. section .bss
  38. msg2 resb 100
  39. section .text
  40. global CMAIN
  41. CMAIN:
  42.    xor eax, eax
  43.    strcpy msg2, msg
  44.    print msg2
  45.    ret 0
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo hacer que este código ensamblador funcione?
« Respuesta #7 en: 21 Octubre 2021, 00:18 am »

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.
En línea

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

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: Como puedo hacer que este código ensamblador funcione?
« Respuesta #8 en: 25 Octubre 2021, 05:14 am »

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

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo hacer que este código ensamblador funcione?
« Respuesta #9 en: 25 Octubre 2021, 09:22 am »

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.
Código
  1. char nnts[] = { 'N', 'E', 'W', 'B', 'I', 'E', 0xCC, 0xCC };
  2. printf("%.*s", 6, nnts);
« Última modificación: 25 Octubre 2021, 09:54 am por Eternal Idol » En línea

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
No puedo hacer que funcione correctamente
Java
John Locke 5 4,126 Último mensaje 25 Abril 2011, 02:32 am
por 1mpuls0
ayuda con este código en ensamblador
ASM
jim12328 6 4,293 Último mensaje 12 Mayo 2014, 22:42 pm
por x64core
Como puedo ver el codigo de este archivo
Hacking
McCript 1 3,276 Último mensaje 21 Junio 2016, 02:44 am
por engel lex
[Pregunta]: ¿Cómo puedo hacer qué esto funcione?
Desarrollo Web
Leguim 2 2,560 Último mensaje 21 Mayo 2020, 11:53 am
por @XSStringManolo
Como puedo revertir este codigo
.NET (C#, VB.NET, ASP)
SrTrp 1 2,376 Último mensaje 1 Julio 2020, 09:51 am
por FFernandez
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines