码迷,mamicode.com
首页 > 其他好文 > 详细

LEA rep stos 指令学习

时间:2020-05-04 21:16:56      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:表示   汇编语言   变量   相对   指令   指针   存储器   过程   cas   

LEA

LEA是微机8086/8088系列的一条指令,取自英语Load effective address——取有效地址,也就是取偏移地址。

指令格式如下:

LEA reg16,mem

LEA指令将存储器操作数mem的4位16进制偏移地址送到指定的寄存器。

这里,源操作数必须是存储器操作数,目标操作数必须是16位通用寄存器。

因该寄存器常用来作为地址指针,故在此最好选用四个间址寄存器BX,BP,SI,DI之一。

LEA 取有效地址指令 (Load Effective Address )

指令功能:取源操作数地址的偏移量,并把它传送到目的操作数所在的单元。

如:

LEA BX ,BUFFER

LEA AX,[BX][DI](j基址加变址寻址)

LEA DX,DATA [BX][SI](相对基址加变址寻址)

LEA指令要求源操作数必须是存储单元,而且目的操作数必须是一个除段寄存器之外的16位或32位寄存器。

当目的操作数是16位通用寄存器时,那么只装入有效地址的低16位。

 

使用时要注意它与MOV指令的区别,MOV指令传送的一般是源操作数中的内容而不是地址。

最近在学习汇编语言,过程中遇到很多问题,对此在以后的随笔会逐渐更新,这次谈谈mov,lea指令的区别

一,关于有没有加上[]的问题

1,对于mov指令来说:

         有没有[]对于变量是无所谓的,其结果都是取值

                          如: num dw 2

                                mov bx,num

                                mov cx,[num];bx=cx=2

        对于寄存器而言,有[]表示取地址,没[]表示取值

                           如: num dw 2

                                mov ax,num

                                mov bx,ax;bx=2 

                                mov bx,[ax];mov bx;DS:[ax],这里可能存在报错的情况,总之大体意思能理解就行

2,对于lea指令来说:

       有没有[]对于变量是无所谓的,其结果都是取变量的地址,相当于指针(与mov相反)

                            如:num dw 2

                                  lea  ebx,num;

                                  lea  eax,[num];ebx=eax

       对于寄存器而言,有[]表示取值,没[]表示取地址

                             如:mov eax,2

                                   mov ebx,[eax];ebx=2

                                   mov ebx,eax;eax=地址,随程序的不同而不同

rep stos

lea     edi,[ebp-0C0h]
mov     ecx,30h
mov     eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
rep指令的目的是重复其上面的指令.ECX的值是重复的次数.
STOS指令的作用是将eax中的值拷贝到ES:EDI指向的地址.

如果设置了direction flag, 那么edi会在该指令执行后减小,
如果没有设置direction flag, 那么edi的值会增加.

REP可以是任何字符传指令(CMPS, LODS, MOVS, SCAS, STOS)的前缀.
REP能够引发其后的字符串指令被重复, 只要ecx的值不为0, 重复就会继续.
每一次字符串指令执行后, ecx的值都会减小.

stos((store into String),意思是把eax的内容拷贝到目的地址。
用法:stos dst,dst是一个目的地址,例如:stos dword ptr es:[edi]。dword ptr前缀告诉stos,一次拷贝双字(4个字节)的数据到目的地址。
执行stos之前必须往eax(32为寄存器)放入要拷贝的数据。上图中,eax的内容是cccccccc,不用说都明白int3中断。
这段代码是初始化堆栈和分配局部变量用的,往分配好的局部变量空间放入int3中断的原因是:防止该空间里的东东被意外执行

参考:

https://blog.csdn.net/ypist/article/details/8467163

百度百科

LEA rep stos 指令学习

标签:表示   汇编语言   变量   相对   指令   指针   存储器   过程   cas   

原文地址:https://www.cnblogs.com/mysky007/p/12828019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!