欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STOS指令和LEA指令

程序员文章站 2022-06-07 08:48:25
...

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

DF 0 1
ADD SUM
STOS指令和LEA指令

这是汇编代码

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]到底是谁?

STOS指令和LEA指令

窝直接运行了

STOSW
STOSB

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

数据宽度 DWORD WORD BYTE
4 2 1

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

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

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

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

STOS指令和LEA指令

LEA指令

lea指令的意思是装入有效地址,那么什么是装入有效地址呢?

lea eax,[401000]

这条汇编代码的意思是把401000h装入eax里,401000h就是所谓的有效地址了。这条汇编代码其实等价于

mov eax,401000

但是lea指令运行的效率比mov更好,尤其是在计算加和的时候,lea指令能够同时计算多个加数

lea eax,[ebx+3+ecx]
"而我们的mov只能是这样的"
mov eax,ebx
add eax,3
add eax,ecx

运行的效率高下立判了吧。

相关标签: 汇编 反汇编