assembly 无法将字符串从堆栈移回寄存器

iyzzxitl  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(120)

我是汇编语言的新手,所以在过去的一周里,我用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来编译/链接它们。

tcbh2hod

tcbh2hod1#

好吧..这有点尴尬,但事实证明我试图以错误的方式打印rsp(我正在做x/s $rsp),现在我明白为什么它不起作用了。而且,我意识到我没有在提供的代码中测试rdx的值。我对原始代码做了,值确实是错误的。但是在简化这篇文章的代码时,我删除了导致bug的代码行,并假设它们没有那么大的影响。是的,他们做到了。愿这对我和其他处于我这种情况的人来说都是一个教训。谢谢你们指出我的错误。以后一定会更加小心!

相关问题