我正在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验证了这一点。 我在互联网上的任何地方都找不到答案。 如果有人可以解释正在发生的事情以及如何解决这个问题, 我会很感激的
答案 0 :(得分:4)
您可能正在使用nexti
或next
,它们将移入而不是移入它们。
在函数内部的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)