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!
Tôi nghĩ đó là cú pháp c? Tôi đang tìm cách gọi nó trong hội đồng. –
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'. –
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' –