首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MOV指令修改指针

MOV指令修改指针
EN

Stack Overflow用户
提问于 2020-07-31 11:44:34
回答 1查看 124关注 0票数 0

我是asm的新手,我问自己以下(简单的)问题:如果我在esp中有一个数组,我会这样写:

代码语言:javascript
复制
mov ebx,[esp + 0x10]
mov edx,[esp + 0x10]

edx是否具有与ebx相同的值?

关于lea (我看到这里有很多主题,所以只是检查一下我是否正确地理解^^),如果是这样的话:

代码语言:javascript
复制
lea ebx, [esp + 0x8c]
and ebx, 0x4

and会影响ebx的地址或它所指向的值?

我的最后一个问题(仍然是关于lea),如果我知道的话:

代码语言:javascript
复制
lea edx, [esp, 0x10]
movzx ecx, [edx-0x5]

mov从地址中减去5,还是从edx所指向的值中再次减去5?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-31 11:54:24

会有与ebx相同的值吗?

是的,因为您将相同的值移动到edxebx中。

和影响ebx地址或它所指向的值?

and将将和操作应用到地址esp + 0x8c

,mov从地址中减去5,还是从edx所指向的值中再次减去5?

寻址模式从edx中的数字中减去5,从而创建一个地址。位于此位置的字节或2字节内存块是movzx的源操作数,它加载和零扩展它。(您忘记指定源操作数大小,这样就不会实际组装。)

mov只是复制数据而不对其进行变异;您可以认为地址数学首先发生;寻址模式对所有指令的工作方式都是一样的。( LEA作为不取消地址引用的特例。)

最后一个问题的例子是:

代码语言:javascript
复制
uintptr_t edx = 0x10 + (uintptr_t)esp;
uint32_t ecx = *(uint8_t*)(edx-0x5);

或者作为C代码:

代码语言:javascript
复制
char* someChars=malloc(32);
//Fill someChars

uint8_t* edx = &someChars[0x10];
uint32_t ecx = edx[-5];       // ==someChars[11]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63191247

复制
相关文章

相似问题

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