J'ai récemment lu cet article sur l'utilisation de printf et scanf dans l'assemblage:Printf sans retour à la ligne dans l'assemblage
Meaning of intfmt: db "%d", 10, 0 in assembly
En particulier, il dit « En printf, la nouvelle ligne imprime une nouvelle ligne, puis (si la sortie est en mode tampon en ligne, ce qui est probablement le cas), vide le tampon de sortie interne pour que vous puissiez réellement voir le résultat.Quand vous supprimez le 10, il n'y a pas de vidage et vous ne voyez pas la sortie. "
Cependant, je ne sais pas quoi faire si je ne veux pas de retour à la ligne après ma sortie dans mon fichier d'assemblage. est ici un fichier de test simple que je l'ai écrit pour essayer d'imprimer sans une nouvelle ligne:
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
mais comme l'article que j'ai lu suggère stdout n'est pas rincé. Je pensais peut-être que je devrais d'une manière ou d'une autre flush après avoir sorti le numéro? Mais je ne suis vraiment pas sûr. J'utilise le langage d'assemblage NASM.
Merci d'avance!
Je pense que la syntaxe est c? Je cherche comment l'appeler en assemblée. –
Selon la norme C, 'stdout' est une macro qui se développe en une expression de type' FILE * '. Je ne sais pas comment cela est défini dans votre compilateur. Vous devez extraire la valeur de 'stdio.h'. –
Et vous pouvez appeler 'fflush (NULL)' qui est plus facile dans le code d'assemblage, peut-être 'xor% eax,% eax; Appelez fflush' –