es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo imprimir elementos de tipo byte en la pantalla en ensamblador?

Usé la función printf. Según sé, solo se pueden empujar variables/registros de tipo doubleword. Entonces, al principio convertí los bytes a doublewords, pero de alguna manera no funciona.

bits 32 
global start
extern exit, printf 
import exit msvcrt.dll
import printf msvcrt.dll

segmento de datos use32 class=data
D db ‘a’, ‘A’, ‘b’, ‘B’, ‘2’, ‘%’, ‘x’
len EQU $-D

Me gustaría imprimir lo que contiene D. Lo intenté de dos formas:

1.

segmento de código use32 class=código
start:
    mov ecx, len
    mov esi, 0
    mostrar_en_pantalla:
        mov al,[D+esi]
        mov ah, 0
        mov dx, 0
        push dx
        push ax
        pop eax
        push dword eax
        call [printf]
        add esp, 4
        inc esi
    loop mostrar_en_pantalla
    push    dword 0
    call    [exit]
  1. Añadí una variable en el segmento de datos
char db 'x', 0

segmento de código use32 class=código
start:
mov ecx, len
mov esi, 0
mostrar_caracteres:
mov al,[D+esi]
mov [char], al
push dword char
call [printf]
add esp, 4
inc esi
loop mostrar_caracteres
push dword 0
call [exit]

Tags:  ,

Answer

  1. Avatar for davy.ai

    En el primer método, el error puede deberse al hecho de que estás intentando imprimir un valor de byte colocándolo en un registro de doubleword, lo cual no está permitido. La función printf espera que el argumento esté en el formato especificado por la cadena de formato, y pasar un valor de byte en un formato de doubleword puede causar problemas.

    En el segundo método, el problema puede ser que no estás terminando correctamente la cadena almacenada en la variable de tipo char. La función printf espera argumentos que sean cadenas terminadas en null, y no terminar la cadena puede causar un comportamiento inesperado.

    Un enfoque mejor podría ser utilizar la función printf con el formateador %c para imprimir cada carácter en el búfer. De esta manera evitarás el problema de conversión de byte a doubleword y también te asegurarás de que el carácter se imprima correctamente.

    Ejemplo:

    segment code use32 class=code
    start:
        mov ecx, len
        mov esi,0
        show_characters:
         mov al,[D+esi]
         push eax
         push dword " %c "
         call [printf]
         add esp,8
         inc esi
        loop show_characters
        push    dword 0      
        call    [exit] 
    

    Aquí, pasamos un valor de byte en el registro eax a printf utilizando el especificador de formato %c. También empujamos la cadena de formato ” %c ” en la pila antes de llamar a la función printf. Esto asegura que el carácter se imprima correctamente y evita cualquier problema relacionado con la conversión de byte a doubleword.

Comments are closed.