2011-12-14 19 views
6

में न्यू लाइन के बिना मैं हाल ही में विधानसभा में printf और scanf का उपयोग करने पर इस लेख पढ़ा है:Printf विधानसभा

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

विशेष रूप से यह कहते "printf में, न्यू लाइन एक नई पंक्ति और फिर प्रिंट (यदि आउटपुट लाइन बफर्ड मोड में है, जो शायद यह है), आंतरिक आउटपुट बफर को फ्लश करता है ताकि आप वास्तव में परिणाम देख सकें। इसलिए जब आप 10 को हटाते हैं, तो फ्लश नहीं होता है और आपको आउटपुट दिखाई नहीं देता है। "

हालांकि मुझे नहीं पता कि अगर मैं अपनी असेंबली फ़ाइल में अपने आउटपुट के बाद एक नई लाइन नहीं चाहता हूं तो मुझे क्या करना है। यहाँ एक सरल परीक्षण फ़ाइल मैं एक नई पंक्ति के बिना मुद्रण कोशिश करने के लिए लिखा गया है:

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 

लेकिन लेख मैं पढ़ा है के रूप में पता चलता है stdout प्लावित नहीं जा रहा है। मैं सोच रहा था कि मुझे संख्या को आउटपुट करने के बाद शायद किसी तरह से फ्लश करने की ज़रूरत है? लेकिन मुझे सच में यकीन नहीं है।

मैं NASM असेंबली भाषा का उपयोग कर रहा हूं।

अग्रिम धन्यवाद!

उत्तर

3

मेरे सवाल के लिए सही जवाब के लिए के रूप में BasileStarynkevitch ऊपर एक टिप्पणी में पता चलता है। मैं अपने कोड में जोड़ने के लिए की जरूरत:

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

वर्तमान में बफर में बैठे हुए प्रदर्शन को प्रदर्शित करने के लिए fflush(stdout); पर कॉल करें।

+0

मुझे लगता है कि ग वाक्य रचना है? मैं इसे असेंबली में कॉल करने के लिए देख रहा हूं। –

+0

सी मानक के अनुसार, 'stdout' एक मैक्रो है जो' FILE * 'प्रकार की अभिव्यक्ति में फैलता है। मुझे नहीं पता कि यह आपके कंपाइलर में कैसे परिभाषित किया गया है। आपको 'stdio.h' से मान निकालने की आवश्यकता है। –

+3

और आप 'fflush (NULL)' को कॉल कर सकते हैं जो असेंबली कोड में आसान है, शायद 'xor% eax,% eax; कॉल fflush' –

3

FASM

push [_iob] 
call [fflush] 

में एनएएसएम लोक

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

आप NASM में इसे कैसे पूरा करेंगे? क्या यह वही है? –

1

अन्य संभावना stdout धारा के डिफ़ॉल्ट लाइन बफरिंग दूर करने के लिए किया जाएगा। यहां सी कॉल करने के लिए कॉल करें। असेंबली में अनुवाद अभ्यास के रूप में जाने दें, क्योंकि मुझे नहीं लगता कि यह एएसएम में फ़ाइल/स्ट्रीम I/O करने के लिए भी समझ में आता है, लागत/लाभ बहुत गलत है।

setvbuf(stdout, NULL, _IONBF, 0); 

इस तरह हर printf (और fputs, putc, puts आदि ...) के लिए होता है एक अंतर्निहित fflush