首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AT&T中的汇编语言寻址

AT&T中的汇编语言寻址
EN

Stack Overflow用户
提问于 2013-06-11 22:58:05
回答 1查看 104关注 0票数 0

有没有人能帮我理解这个命令:

代码语言:javascript
运行
复制
mov %esp,%edi

lea 0x10(%edi),%esi

首先,我将esp的地址加载到edi。然后加载edi+10的值,这意味着将esp+10的地址加载到esi。但是,这对堆栈意味着什么呢?如果我做一个推送,我会在堆栈上写4个字节,对吗?如果我在堆栈上跳回10个字节,这一点在哪里?

代码语言:javascript
运行
复制
|______|         # here?
|______|
|______|
|______|
|______|
|______|
|______|
|___*__|         # or at the position of the star?
|______|         # 4 Byte
|______|         # also 4 Byte long...
|______|   <---%edi
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-11 23:41:52

你用的是x86,不是x64,对吧?我将假设这一点。

“这对堆栈意味着什么?”

代码语言:javascript
运行
复制
mov %esp,%edi
lea 0x10(%edi),%esi

此代码不会对堆栈操作(pushpop等)产生任何影响。这是因为堆栈操作作为堆栈指针在esp寄存器上工作。上面的代码没有更改esp,所以就堆栈而言,没有任何更改。

“如果我执行推送,我会在堆栈上写入4个字节,对吗?”:

不一定。x86支持16位和32位操作数的推送操作,因此写入堆栈的字节数取决于推送操作的大小。例如:

代码语言:javascript
运行
复制
push %ax  ; will push 2 bytes on the stack (sizeof(ax) == 2)
push %eax ; will push 4 bytes on the stack (sizeof(eax) == 4)

请注意,push还减去了sizeof(op1)esp

“如果我在堆栈上跳回10个字节,这一点在哪里?”

esi上的lea命令不会更改堆栈指针。所以,

代码语言:javascript
运行
复制
nop                   ; 10 points back on the stack here
mov %esp,%edi       
lea 0x10(%edi),%esi
nop                   ; will be the exact same location as here.
                      ; relative to esi, this location is (esi - 26)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17047310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档