2011-12-14 2 views
6

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!

Répondre

3

La bonne réponse pour ma question est aussi BasileStarynkevitch suggère dans un commentaire ci-dessus. je devais ajouter dans mon code:

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

Appelez fflush(stdout); pour afficher ce qui est actuellement dans les tampons.

+0

Je pense que la syntaxe est c? Je cherche comment l'appeler en assemblée. –

+0

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'. –

+3

Et vous pouvez appeler 'fflush (NULL)' qui est plus facile dans le code d'assemblage, peut-être 'xor% eax,% eax; Appelez fflush' –

3

Dans FASM

push [_iob] 
call [fflush] 

Pour MSNA populaire

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

Comment accompliriez-vous cela dans NASM? Est-ce la même? –

1

L'autre possibilité serait de supprimer la mise en mémoire tampon de ligne par défaut du flux stdout. Ici, l'appel C pour le faire. La traduction en assembleur est un exercice, car je ne pense pas qu'il soit judicieux de faire des E/S de fichiers/flux dans ASM, le rapport coût/bénéfice est terriblement mauvais.

setvbuf(stdout, NULL, _IONBF, 0); 

De cette façon, tous les printf (et fputs, putc, puts etc ...) aurait un implicite fflush

Questions connexes