stack-pointer相关内容
例如如果我推了 ax 是 [SP] 指向我的 ax 值还是 ax 后面的单词?它也不同于实模式和保护模式吗?我问这个是因为汇编艺术书说明和解释了 sp 指向最后推送的数据,并且在此页面上 OSDev Wiki- 堆栈它在最后一次推送数据后指向空字. 解决方案 维基百科说这里: 堆栈是通过隐式递减(推送)实现的,并且递增(弹出)堆栈指针.在 16 位模式下,此隐式堆栈指针寻址为 SS:
..
已知%rsp指向栈帧的顶部,%rbp指向栈帧的底部.那我就无法理解为什么 %rbp 在这段代码中是 0x0: (gdb) x/4xg $rsp0x7ffffffffe170: 0x00000000004000dc 0x00000000000000100x7ffffffffe180: 0x0000000000000001 0x00007ffffffffe487(gdb) disas HelloWo
..
我对 pop 在汇编中的实际作用感到困惑.pop 是否将最后一个 PUSH ed 的值移动到堆栈上(这意味着如果我们 MOV 在最后一个元素之后的一个值PUSHed) 或者它只是弹出堆栈中最后一个值(因此,适用于 MOV 和 PUSH),或者它是否弹出堆栈指针所指向的值是什么?考虑以下代码: push $4mov $5, -4(%esp)添加 $4, %esp (esp 指向一个未知值)弹出 %
..
我试图了解推入和弹出堆栈指针寄存器的行为.在 AT&T 中: pushl %esp 和 popl %esp 请注意,它们将计算出的值存储回 %esp. 我正在独立考虑这些说明,而不是按顺序考虑.我知道存储在 %esp 中的值始终是递增/递减之前的值,但是我如何用汇编语言表示行为?这是我目前想到的. 对于pushl %esp(忽略FLAGS和对临时寄存器的影响): movl %
..
所以我正在尝试学习一些汇编,因为我需要它用于计算机体系结构课程.我写了一些程序,比如打印斐波那契数列. 我认识到,每当我编写一个函数时,我都会使用这 3 行代码(正如我从 gcc 生成的汇编代码与其等效的 C 比较中学到的那样): pushq %rbpmovq %rsp, %rbpsubq 16 美元,%rsp 我有两个问题: 首先,为什么我需要使用%rbp?使用 %rsp 不是更
..
在阅读有关汇编程序的文章时,我经常遇到有人写道,他们推送处理器的某个寄存器,然后再次弹出以恢复它以前的状态. 如何推送寄存器?它被推到哪里去了?为什么需要这样做? 这归结为单个处理器指令还是更复杂? 解决方案 推送一个值(不一定存储在寄存器中)意味着将它写入堆栈. 弹出意味着将堆栈顶部的任何内容恢复到寄存器中.这些是基本说明: push 0xdeadbeef ;将值压入堆栈
..
使用来自维基百科的这个例子,其中 DrawSquare() 调用 DrawLine(), (请注意,此图底部的高地址和顶部的低地址.) 谁能解释一下在这种情况下ebp 和esp 是什么? 据我所知,堆栈指针总是指向堆栈的顶部,而基指针总是指向当前函数的开头?或者什么? 编辑:我的意思是在 Windows 程序的上下文中 edit2:eip 也是如何工作的? ed
..
我有两个寄存器 w1 和 w2,我想将它们存储在堆栈中.我想将完整的单词 w1 和 w2 的一半存储到堆栈中.这是我的实现: STR w1, [sp, #-8]!STRH w2,[sp,#-8]! 在编译时,第一条指令运行良好,但第二条指令引发总线错误.我知道这是一些对齐问题,但我无法正确理解为什么会发生这种情况? 我正在为 ARMv8(64 位)架构编译. 解决方案 根据 AR
..
众所周知,微处理器执行任务的过程只是从内存中一条一条地执行二进制指令,并且有一个程序计数器保存下一条指令的地址.所以这就是处理器如何执行它的任务,如果我没有错的话.但是还有另一个名为 Stack Pointer 的指针,它的作用与程序计数器几乎相同.我的问题是为什么我们需要一个堆栈指针来指向内存(堆栈)的地址?有人能告诉我堆栈指针和程序计数器之间的主要区别吗? 解决方案 void show
..
在 x86 程序集中,是否可以从堆栈中删除一个值而不存储它?类似于 pop word null 的东西?我显然可以使用 add esp,4,但也许我缺少一个漂亮干净的 cisc 助记符? 解决方案 add esp,4/add rsp,8 是 正常/惯用/干净的方式.不需要特殊方式,因为堆栈并不神奇或特殊(至少在这方面不是);它只是寄存器中的一个指针,其中包含一些隐式使用它的指令.(对于内核
..
ret 指令 是否会导致“esp"?注册要增加 4 个? 解决方案 是的,它执行 pop eip 你可以使用 mov eax, [esp]jmp eax 避免它. 编辑:这正是 ret 所做的.例如,jmp rel_offet 只不过是一个隐藏的 add eip, offset,或者 jmp absolute_offset 是 mov eip, absolute_offset
..
在继续一些windbg教程时,我注意到一些使用 k 命令的调用栈都采用这种格式,特别是我的 Child-SP RetAddr呼叫站点 其他在线资源,例如 CodeProject 让 k 命令以这种格式吐出信息 Child-EBP RetAddr呼叫站点 我很困惑为什么我的输出与其输出之间存在差异,以及真正含义是什么. 解决方案 这取决于所使用的调用约定.某些函数分配了局部变
..
众所周知,微处理器执行任务的过程只是从存储器一个接一个地执行二进制指令,并且有一个程序计数器保存下一条指令的地址.因此,如果我没有记错的话,这就是处理器执行任务的方式.但是还有另一个名为堆栈指针的指针,它的作用与程序计数器几乎相同.我的问题是为什么我们需要一个堆栈指针来指向内存(堆栈)的地址?有人可以告诉我堆栈指针和程序计数器之间的主要区别吗? 解决方案 void show(unsign
..
有人告诉我是否使用 rsp 作为通用寄存器,如果发生中断,操作系统可能会将寄存器转储到它指向的位置,从而导致问题行为。 / p> 是真的,如果不是这样,如果不需要堆栈,可以使用 rsp 作为 编辑:在用户空间中运行。 解决方案 如果发生中断,您是否不知所措? 在DOS中进行编程的人可能会在这一点上对中断的可能性感到困惑。通常,像这样重用堆栈指针是一个非常糟糕的主意,因
..
我知道call和ret会修改esp的值,并且push和pop有许多变体,但是还有其他指令会影响堆栈指针吗? > 解决方案 以下说明修改了堆栈指针 1 : call enter int n/into/int 3 iret/iretd leave pop push ret sysenter sysexit pusha/pushad popa/popad pushf/p
..
void main(){ int c; c = function(1, 2); } int function(int a, int b){ char buf[10]; a = a+b; return a; } 组装代码: main: 08048394: push %ebp 08048395: mov %es
..
我正在vs2008中编译一个c ++静态库,在解决方案中,我也有一个使用lib的启动项目,并且运行良好. 但是在另一个解决方案中使用lib时,出现运行时检查失败. "ESP的值未在整个函数调用中正确保存" 逐步执行代码,我注意到崩溃之前,函数foo()跳转到bar().有问题的函数只是常规函数,没有函数指针. 任何人都知道可能会发生什么,以及为什么在同一解决方案中使用lib时为何起作用
..
例如,如果我按下斧头,则[SP]指向我的斧头值还是斧头后的单词?从实模式到保护模式是否也有所不同?我之所以这样问,是因为汇编书中的技巧将sp指向并解释为最后推送的数据,并在此页面上 OSDev Wiki -堆栈,它说明了它在最后一次推送数据之后指向空字的情况. 解决方案 维基百科说此处: 通过隐式递减(推)和 递增(弹出)堆栈指针.在16位模式下,此隐式堆栈 指针的地址为SS:[SP
..
因此,我尝试学习一些汇编语言,因为计算机架构课程需要它.我写了一些程序,例如打印斐波那契数列. 我认识到,每当我编写一个函数时,我都会使用这三行代码(从比较从gcc生成的汇编代码到等效于C的汇编代码中学到) pushq %rbp movq %rsp, %rbp subq $16, %rsp 我对此有2个问题: 首先,为什么我需要使用%rbp?将%rsp的内容移至第
..
众所周知,%rsp 指向堆栈框架的顶部,%rbp 指向堆栈框架的底部。然后我无法理解为什么%rbp是0x0 在这段代码中: (gdb )x / 4xg $ rsp 0x7fffffffe170:0x00000000004000dc 0x0000000000000010 0x7fffffffe180:0x0000000000000001 0x00007fffffffe487 (gdb
..