STOS指令和LEA指令
STOS指令和LEA指令
因为网上有些资料存在一些错误,所以写了这篇博客以供复习之用
STOS
STOS指令有3种,分别对应的是3种数据形式DWORD,WORD,BYTE
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,这要取决于EFL的DF位。[4,2,1]则取决于数据宽度
ADD还是SUM
DF | 0 | 1 |
---|---|---|
ADD | SUM |
这是汇编代码
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]到底是谁?
窝直接运行了
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嘛
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
运行的效率高下立判了吧。
上一篇: 那些曾虐我千百遍的计算机组成原理
下一篇: 汇编语言学习【1】-寄存器