NASM 调用标签未被调用
NASM call label doesn't get called
我正在 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 验证了这一点。
我没有在其他地方找到相关的解释。
如果有人可以解释发生了什么以及如何解决这个问题,
我将不胜感激。
您可能正在使用 nexti
或 next
,其中步骤 超过 调用,而不是进入它们。
在函数内的 mov rdi, 12
上设置断点,或使用 stepi
(或 si
简称)。
或者,如果您不信任 GDB,请编写一个程序,其退出状态取决于函数 运行s 与否。
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
。或者除以零。会引发异常而不是让您的进程进行退出系统调用的东西。那么你肯定会注意到它是否被调用。
另请参阅 要以与 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)
我正在 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 验证了这一点。 我没有在其他地方找到相关的解释。 如果有人可以解释发生了什么以及如何解决这个问题, 我将不胜感激。
您可能正在使用 nexti
或 next
,其中步骤 超过 调用,而不是进入它们。
在函数内的 mov rdi, 12
上设置断点,或使用 stepi
(或 si
简称)。
或者,如果您不信任 GDB,请编写一个程序,其退出状态取决于函数 运行s 与否。
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
。或者除以零。会引发异常而不是让您的进程进行退出系统调用的东西。那么你肯定会注意到它是否被调用。
另请参阅 _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)