NASM Linux程序集打印整数

我正在尝试在linux上的nasm程序集中打印一个数字的整数。 我目前编译的很好,但没有写入屏幕。 任何人都可以向我解释我在这里做错了吗?

section .text global _start _start: mov ecx, 1 ; stores 1 in rcx add edx, ecx ; stores ecx in edx add edx, 30h ; gets the ascii value in edx mov ecx, edx ; ascii value is now in ecx jmp write ; jumps to write write: mov eax, ecx ; moves ecx to eax for writing mov eax, 4 ; sys call for write mov ebx, 1 ; stdout int 80h ; call kernel mov eax,1 ; system exit mov ebx,0 ; exit 0 int 80h ; call the kernel again 

Solutions Collecting From Web of "NASM Linux程序集打印整数"

这是添加,而不是存储:

 add edx, ecx ; stores ecx in edx 

这将ecx复制到eax,然后用4:

 mov eax, ecx ; moves ecx to eax for writing mov eax, 4 ; sys call for write 

编辑:

对于“写入”系统调用:

 eax = 4 ebx = file descriptor (1 = screen) ecx = address of string edx = length of string 

在回顾了其他两个答案之后,我终于想到了这一点。

 sys_exit equ 1 sys_write equ 4 stdout equ 1 section .bss outputBuffer resb 4 section .text global _start _start: mov ecx, 1 ; Number 1 add ecx, 0x30 ; Add 30 hex for ascii mov [outputBuffer], ecx ; Save number in buffer mov ecx, outputBuffer ; Store address of outputBuffer in ecx mov eax, sys_write ; sys_write mov ebx, stdout ; to STDOUT mov edx, 1 ; length = one byte int 0x80 ; Call the kernel mov eax, sys_exit ; system exit mov ebx, 0 ; exit 0 int 0x80 ; call the kernel again 

从男人2写

 ssize_t write(int fd, const void *buf, size_t count); 

除了已经指出的其他错误之外,write()还会使用一个指向数据和指针的长度,而不是寄存器中的实际字节本身。

所以你将不得不把数据从一个寄存器存储到内存中,并使用该地址(或者,如果它现在是不变的,不要将数据加载到寄存器中,而是加载它的地址)。