我是汇编语言的新手,所以在过去的一周里,我用x86 asm(intel语法)重写了很多c函数,作为自学这门语言的练习。当我在一些函数中挣扎着操作堆栈时,我试图隔离有错误的代码行,这是我留下的:
extern int my_func(const char *s);
int main(void)
{
return my_func("700");
}
这是我在c中的main,它被编译并与以下汇编代码链接:
section .text
global my_func
my_func:
push rbp
mov rbp, rsp
sub rsp, 8 ; allocating stack memory to save both pointers
mov qword [rsp], rdi ; saving s
mov rdx, qword [rsp] ; moving s back into a register
xor rax, rax ; set return value to 0
add rsp, 8 ; clear stack
pop rbp
ret
我很清楚这个函数没有做任何事情,但是当我通过gdb检查堆栈帧和寄存器时,我找不到我的指针; rdx
永远不会得到正确的数据。就好像它从来没有被保存到堆栈中一样。让我抓狂的是,用整数做同样的操作可以完美地工作。
如果有人愿意解释发生了什么事,我会非常感激:)!
PS:我使用nasm -g -felf64 my_file.s
来assmeble和gcc -g main.c my_file.o
来编译/链接它们。
1条答案
按热度按时间tcbh2hod1#
好吧..这有点尴尬,但事实证明我试图以错误的方式打印
rsp
(我正在做x/s $rsp
),现在我明白为什么它不起作用了。而且,我意识到我没有在提供的代码中测试rdx
的值。我对原始代码做了,值确实是错误的。但是在简化这篇文章的代码时,我删除了导致bug的代码行,并假设它们没有那么大的影响。是的,他们做到了。愿这对我和其他处于我这种情况的人来说都是一个教训。谢谢你们指出我的错误。以后一定会更加小心!