zoukankan      html  css  js  c++  java
  • LEA rep stos 指令学习

    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

    百度百科

  • 相关阅读:
    新手入门贴之基于 python 语言的接口自动化 demo 小实战
    记新人从 excel 文件中读取字典数据踩的一个坑
    接口自动化 之 unittest+ddt+openpyxl 综合
    接口自动化之unittest+ddt
    接口自动化之unittest初探
    python之类与对象(5)
    python之类与对象(4)
    python之类与对象(3)
    python之类与对象(2)
    传智播客JavaWeb day01 快捷键、XML
  • 原文地址:https://www.cnblogs.com/mysky007/p/12828019.html
Copyright © 2011-2022 走看看