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!
Creo que esa es la sintaxis de C? Estoy buscando cómo llamarlo en ensamblaje. –
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'. –
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' –