我是靠谱客的博主 忧伤大神,最近开发中收集的这篇文章主要介绍STOS指令和LEA指令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 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

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

最后

以上就是忧伤大神为你收集整理的STOS指令和LEA指令STOS指令和LEA指令的全部内容,希望文章能够帮你解决STOS指令和LEA指令STOS指令和LEA指令所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部