NASM呼叫标签未被调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NASM呼叫标签未被调用相关的知识,希望对你有一定的参考价值。

我正在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来调用它们而不是它们。

在函数内部的mov rdi, 12上设置断点,或者使用stepi(简称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?要使本机64位exit(0)系统调用与glibc的_exit()函数相同,请执行

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

以上是关于NASM呼叫标签未被调用的主要内容,如果未能解决你的问题,请参考以下文章

使用GDB for NASM程序集中断本地标签

Jersey ExceptionMapper未被调用

如果 nasm 代码遇到 _start 的结尾,它会自动移动到下一个标签吗? [复制]

广播接收器未被呼叫

导航到另一个片段时触发 API 调用

标签菜单android - 不正确的调用片段