2011-12-14 32 views
6

yılında yeni satır olmadan Geçenlerde mecliste printf ve scanf kullanımı hakkında bu makaleyi okudum: o printf olarak" diyor ÖzelliklePrintf montaj

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

, yeni satır (eğer o zaman bir yeni satır ve yazdırır Çıktı, büyük olasılıkla olduğu gibi satır tamponlu moddadır, iç çıktı arabelleğini temizler, böylece sonucu gerçekten görebilirsiniz. Böylece 10'u çıkardığınızda, sifon yok ve çıktıyı göremezsiniz. "

Ancak, derleme dosyasımdaki çıktımdan sonra yeni bir satır istemediğimde ne yapacağımı bilmiyorum. Burada bir satır olmadan yazdırmayı denemek için yazdım basit bir test dosyası var:

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 

ama okudum makale olarak stdout'u boşaltılan değil göstermektedir. Belki de numarayı çıkardıktan sonra bir şekilde durmam gerektiğini düşünüyorum. Ama gerçekten emin değilim.

NASM derleme dilini kullanıyorum.

Şimdiden teşekkürler!

cevap

3

benim soru için doğru cevap için

push [_iob] 
call [fflush] 

FASM

yılında

3

Şu anda arabellekte oturanları görüntülemek için fflush(stdout); numaralı telefonu arayın. BasileStarynkevitch yukarıdaki yorumunda anlaşılacağı gibi NASM halk

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

O c sözdizimi olduğunu düşünüyorum? Montajda nasıl arayacağımı arıyorum. –

+0

C standardı uyarınca, "stdout", 'FILE *' türünde bir ifadeye genişleyen bir makrodur. Derleyicinizde nasıl tanımlandığını bilmiyorum. Stdio.h'den değeri almanız gerekir. –

+3

Ve montaj kodunda daha kolay olan 'fflush (NULL)' diyebilirsiniz, belki 'xor% eax,% eax; fflush'ı ara –

3

olduğunu. benim koduna eklemek için gerekli:

extern fflush 
... 
xor rax, rax 
call fflush 
... 
+0

NASM'de bunu nasıl başarırsınız? Aynı mı? –

1

diğer olasılık stdout akışının varsayılan hat ara belleğe kaldırmak olacaktır. İşte bunu yapmak için C çağrısı. Derleme tercümesi exercice olarak izin verir, çünkü ASM'de dosya/stream I/O yapmak bile mantıklı değil, maliyet/fayda muazzam derecede yanlıştır.

setvbuf(stdout, NULL, _IONBF, 0); 

Bu şekilde her printf (ve fputs, putc, puts vb ...) olurdu örtük fflush