相关疑难解决方法(0)

在x86汇编中寄存器上使用的push/pop指令的功能是什么?

在阅读有关汇编程序的文章时,我经常遇到人们在写文件时他们推送处理器的某个寄存器并稍后再次弹出它以恢复它之前的状态.

  • 怎么能推一个寄存器?它在哪里推?为什么需要这个?
  • 这可归结为单处理器指令还是更复杂?

x86 assembly stack terminology

79
推荐指数
5
解决办法
26万
查看次数

什么是pushl/popl%esp的汇编级表示?

C++

ATT大会

我试图理解以下两条指令的行为:

pushl %esp
Run Code Online (Sandbox Code Playgroud)

和:

popl %esp
Run Code Online (Sandbox Code Playgroud)

请注意,它们将计算出的值存储回来%esp.

我正在独立地考虑这些指令,而不是按顺序.我知道存储的值%esp总是递增/递减之前的值,但是我怎么能用汇编语言表示行为呢?这是我到目前为止所提出的:

推送:

movl %esp, %edx     1. save value of %esp
subl  $4, %esp      2. decrement stack pointer
movl %edx, (%esp)   3. store old value of %esp on top of stack
Run Code Online (Sandbox Code Playgroud)

对于pop:

movl (%esp), %esp   You wouldn’t need the increment portion. 
Run Code Online (Sandbox Code Playgroud)

它是否正确?如果没有,我哪里错了?谢谢.

x86 assembly stack att

7
推荐指数
1
解决办法
9187
查看次数

为什么push指令会改变rsp的值?

我正在检查 Ericksons Hacking: The Art of Exploitation 中的这段代码片段:

\n
void test_function(int a, int b, int c, int d) {\n        int flag;\n        char buffer[10];\n        flag = 31337;\n        buffer[0] = \'A\';\n}\n\nint main() {\n        test_function(1, 2, 3, 4); \n}\n
Run Code Online (Sandbox Code Playgroud)\n
void test_function(int a, int b, int c, int d) {\n        int flag;\n        char buffer[10];\n        flag = 31337;\n        buffer[0] = \'A\';\n}\n\nint main() {\n        test_function(1, 2, 3, 4); \n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在 main 和 test_function 处设置了断点。\n当中断 main 时,我得到以下输出:

\n
gcc -g stack_example.c\n\ngdb -q ./a.out\n\ngef\xe2\x9e\xa4list main\n\n\n     0x555555555192 …
Run Code Online (Sandbox Code Playgroud)

c assembly x86-64

0
推荐指数
1
解决办法
4108
查看次数

标签 统计

assembly ×3

stack ×2

x86 ×2

att ×1

c ×1

terminology ×1

x86-64 ×1