STOS指令和LEA指令

STOS指令和LEA指令

因为网上有些资料存在一些错误,所以写了这篇博客以供复习之用

STOS

STOS指令有3种,分别对应的是3种数据形式DWORDWORDBYTE

STOS DWORD PTR ES:[EDI] 'STOSD'
STOS WORD PTR ES:[EDI]  'STOSW'
STOS BYTE PTR ES:[EDI]  'STOSB'

其实就是STOS+数据宽度首字母而已。

而STOS其实等价于

MOV [EDI],EAX
ADD [EDI],[4,2,1] or SUM [EDI],[4,2,1]

而到底是ADD还是SUM,这要取决于EFLDF位。[4,2,1]则取决于数据宽度

ADD还是SUM

DF01
ADDSUM
1.png

这是汇编代码

MOV EAX,12345678
MOV EDI,0019FF6C
STOSD

得到的结果,D是0,而EDI+4变为了0019FF70,同时地址0019FF6C的地方变成了12345678。

如果我们把D改为1,那么就是EDI-4变为0019FF68,地址0019FF6C的地方变成了12345678。

他们的差别只是EDI是往高位地址走还是低位地址走而已。


接下来我们看看不同的数据宽度会产生怎样的结果吧

[4,2,1]到底是谁?

23.png

窝直接运行了

STOSW
STOSB

得到了上图的结果,显而易行的EDI跟之前的0019FF70多了3,或者说是2+1.

数据宽度DWORDWORDBYTE
421

但是在堆栈窗口我们看到的都是相隔为4,那这个0019FF73是怎么表示出来的呢?

这里需要扩展一下别的知识了。我们知道这些数字都是16进制,而16进制在汇编中可以理解是2进制的一种简写。

1位16进制数F可以最多表示4位的二进制数1111。

1个字节(BYTE)是8位二进制数,也就是等于2位16进制数。我想这也是工具中为啥都是隔4排地址的,相当于一个DWORD

3.png

LEA指令

可见简书博客汇编指令LEA。我现在用到的只是取有效地址指令,那个取偏移地址指令也不懂是什么。

需要注意的是,无论如何都只是跟地址有关,而跟地址里的内容无关

昨天又弄了一下LEA,感觉与其说是去偏移地址不如说就是取值,只是这些值常常是偏移地址,才被称为取偏移地址

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值