Como puedo hacer que este código ensamblador funcione?

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

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

Usuario887

Cita de: Eternal Idol en 25 Octubre 2021, 09:22 AM
%.*s

Perdona el cambio de tema, Eternal Idol, pero una pregunta rapida... ¿Esto que sintaxis tiene?

Eternal Idol

https://www.cplusplus.com/reference/cstdio/printf/

"*   The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted."
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

Usuario887

Cita de: Eternal Idol en 25 Octubre 2021, 13:57 PM
https://www.cplusplus.com/reference/cstdio/printf/

"*   The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted."

No sabia que se podia limitar eso... Un riesgo menos.

Gracias

Eternal Idol

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

Creo que esta es la solucion:
Código (asm) [Seleccionar]
%include "io.inc"
%macro print 1
    push eax
    push ecx
    mov eax, %1
    mov ecx, 0
    while:
    add ecx, 1
    cmp byte [eax+ecx], 0
    jmp PRINT_CHAR [eax+ecx-1]
    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

;D

Eternal Idol

Sigue teniendo fallos; SI es un registro 16 bits por lo que la condicion para terminar el bucle se basa en un byte pero lees y escribis 2 bytes por cada iteracion, eso carece de sentido, es ineficiente (sobrescribe datos) y lleva a problemas, por ejemplo, teniendo una cadena vacia:

Código (asm) [Seleccionar]
msg db 0
oops db "BUG", 0


El strcpy no funciona bien, copia la B de oops en msg2  :rolleyes: Estas leyendo mas alla de los limites de la cadena.

Ademas si por ejemplo en lugar de usar msg2 como parametro a print uso msg. ¿Que crees que pasa? Lee un buffer que no deberia leer: oops.


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