Assembly 为什么即使系统调用是sys_write也没有输出?

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来计

我正在学习x86_64汇编,并编写一个简单的代码来打印字符串的各个字母。我知道如何打印整个字符串,但为什么在尝试显示单个字母时没有输出

代码:


你需要传递一个地址才能写。看见而是从内存加载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