linux - NASM 调用标签未被调用

标签 linux assembly nasm x86-64 ld

我正在 Linux 上使用 NASM 进行一些汇编编码,但我遇到了一个问题。

global _start

section .text

testFunctionName:
    mov rdi, 12
    ret

_start:

    call testFunctionName

    mov rax, 1
    mov rbx, 0
    int 0x80

然后组装和链接:

nasm -felf64 -F dwarf -g program.asm -o program.o
ld program.o -o program

testFunctionName 永远不会跳转到。我使用 GDB 验证了这一点。 我没有在其他地方找到相关的解释。 如果有人可以解释发生了什么以及如何解决这个问题, 我将不胜感激。

最佳答案

您可能正在使用 nextinext 步进over 调用,而不是进入它们。

在函数内的 mov rdi, 12 上设置断点,或使用 stepi 单步 into 调用(或si 简称)。

或者,如果您不信任 GDB,请编写一个程序,其退出状态取决于该函数是否运行。

testFunctionName:
    mov  ebx, 12
    ret

_start:
    xor   ebx, ebx   ; ebx=0

    call testFunctionName

    mov   eax, 1
    int   0x80       ; sys_exit(ebx), 32-bit ABI

运行此命令并echo $? 以查看退出状态是 12,而不是 0,因为该函数确实运行,除非您的 CPU、NASM 或您的链接器损坏。


您还可以在测试函数中放置一条非法指令,例如 ud2。或者软件断点:int3。或者除以零。会引发异常而不是让您的进程进行退出系统调用的东西。然后你肯定会注意到它是否被调用。


另见 What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?要像 glibc 的 _exit() 函数一样进行 native 64 位 exit(0) 系统调用,请执行

    xor   edi, edi     ; rdi=0
    mov   eax, 231     ; __NR_exit_group   from <asm/unistd_64.h>
    syscall            ; sys_exit_group(edi)

关于linux - NASM 调用标签未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51165883/

相关文章:

linux - 多线程 Linux 与 Windows

linux - centos服务器检查可用内存的问题

assembly - 为什么执行的 AVX 指令数量会随着处理器系列的不同而变化

linux - nasm array1.o : file not recognized: File format not recognized on Linux 32

linux - 这个 x86 Hello World using 32-bit int 0x80 Linux system calls from _start 的解释是什么?

assembly - (汇编 x86 实模式)数据在程序结束时得到 "cut off"?

c++ - 编写插件系统?

linux - 使用 date 命令打印上个月的最后一天

c - 如何从 VS2005 中的 C 文件获取汇编程序输出

iphone - 如何在 iPhone 上进行内联汇编?