2011-12-14 62 views
6

Recientemente he leído este artículo sobre el uso de printf y scanf en el montaje:Printf sin salto de línea en el montaje

Meaning of intfmt: db "%d", 10, 0 in assembly

En particular, se dice "En printf, el salto de línea imprime una nueva línea y luego (si la salida está en modo línea en búfer, lo que probablemente sea), vacía el búfer de salida interno para que pueda ver el resultado. Por lo tanto, cuando elimina el 10, no hay descarga y no ve la salida ".

Sin embargo, no sé qué hacer si no quiero una nueva línea después de mi salida en mi archivo de ensamblaje. Aquí es un archivo de prueba sencilla que he escrito para tratar de imprimir sin una nueva línea:

extern printf 


LINUX  equ  80H  ; interupt number for entering Linux kernel 
EXIT   equ  60  ; Linux system call 1 i.e. exit() 




section .data 
    int_output_format: db "%ld", 0 


segment .text 
    global main 


main: 
    mov r8, 10 
    push rdi 
    push rsi 
    push r10 
    push r9 
    mov rsi, r8 
    mov rdi, int_output_format 
    xor rax, rax 
    call printf 
    pop r9 
    pop r10 
    pop rsi 
    pop rdi 
    call os_return  ; return to operating system 


os_return: 
    mov rax, EXIT  ; Linux system call 1 i.e. exit() 
    mov rdi, 0  ; Error code 0 i.e. no errors 
    syscall  ; Interrupt Linux kernel 64-bit 

pero como el artículo que he leído sugiere la salida estándar no se enrojeció. Estaba pensando que tal vez necesito enrojecer de alguna manera después de dar salida al número? Pero realmente no estoy seguro

Estoy usando el lenguaje ensamblador NASM.

¡Gracias de antemano!

Respuesta

3

La respuesta correcta a la pregunta es como BasileStarynkevitch sugiere en un comentario anterior. que tenía que añadir en mi código:

extern fflush 
... 
xor rax, rax 
call fflush 
... 
3

Llame al fflush(stdout); para ver lo que se encuentra actualmente en los buffers.

+0

Creo que esa es la sintaxis de C? Estoy buscando cómo llamarlo en ensamblaje. –

+0

Según el estándar C, 'stdout' es una macro que se expande en una expresión de tipo' FILE * '. No sé cómo se define en tu compilador. Necesitas extraer el valor de 'stdio.h'. –

+3

Y puede llamar a 'fflush (NULL)' que es más fácil en el código de ensamblado, quizás 'xor% eax,% eax; llame a fflush' –

3

En FASM

push [_iob] 
call [fflush] 

Para NASM popular

extern fflush 
extern stdout 
... 
push dword [stdout] 
call fflush 
add esp, 4 
etc... 
+0

¿Cómo lograrías esto en NASM? ¿Es lo mismo? –

1

La otra posibilidad sería la de eliminar el búfer de línea por defecto de la corriente stdout. Aquí el C llama para hacer eso. Traducción a ensamblado como ejercicio, ya que no creo que tenga sentido hacer E/S de archivo/flujo en ASM, el costo/beneficio es tremendamente incorrecto.

setvbuf(stdout, NULL, _IONBF, 0); 

De esta manera todos los printf (y fputs, putc, puts etc ...) tendría un implícito fflush

Cuestiones relacionadas