2011-12-14 34 views
6

Tôi vừa mới đọc bài viết này về việc sử dụng printf và scanf trong lắp ráp:printf mà không xuống dòng trong lắp ráp

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

Đặc biệt nó nói "Trong printf, newline in một dòng mới và sau đó (nếu đầu ra ở chế độ đệm dòng, có thể là), xóa bộ đệm đầu ra bên trong để bạn thực sự có thể thấy kết quả. Vì vậy, khi bạn loại bỏ 10, không có tuôn ra và bạn không thấy đầu ra. "

Tuy nhiên tôi không biết phải làm gì nếu tôi không muốn một dòng mới sau khi đầu ra của tôi trong tập tin lắp ráp của tôi. Đây là một tập tin thử nghiệm đơn giản, tôi đã viết thử in ấn mà không một dòng mới:

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 

nhưng như bài viết Tôi đã đọc gợi ý stdout không được đỏ mặt. Tôi đã suy nghĩ có lẽ tôi cần phải bằng cách nào đó tuôn ra sau khi tôi đầu ra số lượng? Nhưng tôi thực sự không chắc chắn.

Tôi đang sử dụng ngôn ngữ lắp ráp NASM.

Cảm ơn trước!

Trả lời

3

Câu trả lời chính xác cho câu hỏi của tôi là như BasileStarynkevitch gợi ý trong một chú thích ở trên. tôi cần phải thêm vào mã của tôi:

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

Gọi fflush(stdout); để hiển thị nội dung hiện đang được lưu trong bộ đệm.

+0

Tôi nghĩ đó là cú pháp c? Tôi đang tìm cách gọi nó trong hội đồng. –

+0

Theo tiêu chuẩn C, 'stdout' là một macro mở rộng thành một biểu thức của kiểu' FILE * '. Tôi không biết nó được định nghĩa như thế nào trong trình biên dịch của bạn. Bạn cần trích xuất giá trị từ 'stdio.h'. –

+3

Và bạn có thể gọi 'fflush (NULL)' dễ dàng hơn trong mã assembly, có lẽ 'xor% eax,% eax; gọi fflush' –

3

Trong FASM

push [_iob] 
call [fflush] 

Đối với NASM dân gian

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

Bạn sẽ thực hiện điều này như thế nào trong NASM? Nó giống nhau không? –

1

Khả năng khác sẽ là để loại bỏ các đệm dòng mặc định của dòng stdout. Đây C gọi để làm điều đó. Dịch để lắp ráp cho phép như tập thể dục, như tôi không nghĩ rằng nó làm cho cảm giác thậm chí để làm tập tin/dòng I/O trong ASM, chi phí/lợi ích là rất nhiều sai.

setvbuf(stdout, NULL, _IONBF, 0); 

Bằng cách này mỗi printf (và fputs, putc, puts vv ...) sẽ có một tiềm ẩn fflush