Assembly 为什么即使系统调用是sys_write也没有输出?
我正在学习x86_64汇编,并编写一个简单的代码来打印字符串的各个字母。我知道如何打印整个字符串,但为什么在尝试显示单个字母时没有输出 代码:Assembly 为什么即使系统调用是sys_write也没有输出?,assembly,nasm,elf,Assembly,Nasm,Elf,我正在学习x86_64汇编,并编写一个简单的代码来打印字符串的各个字母。我知道如何打印整个字符串,但为什么在尝试显示单个字母时没有输出 代码: 你需要传递一个地址才能写。看见而是从内存加载dword。将mov-ecx,dword[msg+ebx]更改为lea-ecx[msg+ebx]。还要注意的是,ebx是write的文件描述符参数,所以用它来编制索引是个坏主意。此外,eax被用作返回值,因此您需要在循环中重新加载它。首先,如果这是问题所在,您的代码将因使用32位寻址模式从msg而不是LEA来计
你需要传递一个地址才能写。看见而是从内存加载dword。将
mov-ecx,dword[msg+ebx]
更改为lea-ecx[msg+ebx]
。还要注意的是,ebx
是write
的文件描述符参数,所以用它来编制索引是个坏主意。此外,eax
被用作返回值,因此您需要在循环中重新加载它。首先,如果这是问题所在,您的代码将因使用32位寻址模式从msg
而不是LEA来计算指针而崩溃。或者实际上不会在饼图中使用32位绝对地址进行链接。无论如何,这段代码的所有内容都是32位的:寻址和32位int 0x80 ABI。如果您试图从64位代码开始,则不是这样。您需要传递一个地址才能写入。看见而是从内存加载dword。将mov-ecx,dword[msg+ebx]
更改为lea-ecx[msg+ebx]
。还要注意的是,ebx
是write
的文件描述符参数,所以用它来编制索引是个坏主意。此外,eax
被用作返回值,因此您需要在循环中重新加载它。首先,如果这是问题所在,您的代码将因使用32位寻址模式从msg
而不是LEA来计算指针而崩溃。或者实际上不会在饼图中使用32位绝对地址进行链接。无论如何,这段代码的所有内容都是32位的:寻址和32位int 0x80 ABI。如果您试图从64位代码开始,则不是这样。
global _start
section .data
msg db 'Hello!', 0x0a
len equ $ - msg
section .text
_start:
mov eax, 4
mov ebx, 0
loop1:
mov ecx, dword [msg+ebx]
mov edx, 1
int 0x80
cmp ebx, dword len
jg exit
add ebx, 1
jmp loop1
exit:
mov eax, 1
mov ebx, 0
int 0x80