में न्यू लाइन के बिना मैं हाल ही में विधानसभा में 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 असेंबली भाषा का उपयोग कर रहा हूं।
अग्रिम धन्यवाद!
मुझे लगता है कि ग वाक्य रचना है? मैं इसे असेंबली में कॉल करने के लिए देख रहा हूं। –
सी मानक के अनुसार, 'stdout' एक मैक्रो है जो' FILE * 'प्रकार की अभिव्यक्ति में फैलता है। मुझे नहीं पता कि यह आपके कंपाइलर में कैसे परिभाषित किया गया है। आपको 'stdio.h' से मान निकालने की आवश्यकता है। –
और आप 'fflush (NULL)' को कॉल कर सकते हैं जो असेंबली कोड में आसान है, शायद 'xor% eax,% eax; कॉल fflush' –