NASM呼叫标签未呼叫

时间:2018-07-04 04:42:35

标签: 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验证了这一点。 我在互联网上的任何地方都找不到答案。 如果有人可以解释正在发生的事情以及如何解决这个问题, 我会很感激的

1 个答案:

答案 0 :(得分:4)

您可能正在使用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或链接器损坏,否则功能会运行。 / p>


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


另请参见What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?要以与glibc的_exit()函数相同的方式进行本机64位exit(0)系统调用,

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