zoukankan      html  css  js  c++  java
  • 总结:常用的通用数据处理指令

    作者:bakari  时间:2012.4.21

    1、 操作数类型

    Imm立即操作数

    Reg寄存器操作数

    Mem内存操作数

    2、 操作数寻址方式

    立即数寻址

    寄存器数寻址

    存储器寻址

    3、 数据传送类指令

    (重点介绍)movxchgpushpoplea

    (除标志寄存器指令外,其余均不影响标志位)

    1.1、  通用数据传送指令

    1)、Mov传送指令

     

    两个操作数的尺寸必须是一致的(但movzxmovsx例外)

    两个操作数不能同时为内存操作数(内存数据不能直接传送)

    指令规则       目的操作数不能为CSEIPIP(会覆盖原来其指向的数)

    立即数不能直接送段寄存器(不允许:mov DS ,Data

    两个段寄存器之间不能直接传送数据

    (其余指令与此类似)

    MOVSX:符号扩展

    MOVZX:零扩展

    8位或16位扩展为32位,两个操作数的尺寸不一致,目的操作数是寄存器

     

    补充:内存内偏移地址的应用   见一段代码:

    .data

    var1  BYTE  10h

    .code

    Mov al , var1

    方括号:[   ]:可用符号地址代替数值地址(var1是一个符号地址)

    .data

    Var1  BYTE  10h,20h,30h

    .code

    Mov al , [var1+2]      ;=mov al , var1+2 al=30h 

     

    2)、交换指令XCHG :

    ----------------------------见一段指令----------------------

    .code

    Mov axvar1

    Xchg axvar2

    Mov var2ax

     

    1.2、  堆栈操作指令(移动地址遵循低对低,高对高的原则)

    1)、进栈指令:push指令 ESP指定栈顶的偏移地址

    ESP逐渐减少(记忆:把堆栈想象成一个倒扣的桶,栈底是高地址,进栈数据增多ESP下移)

    Push指令只表达源操作数,目的操作数在栈顶,由ESP确定。

    ---------------------见一段代码---------------------

    ;进栈指令

    Push eax   ;等同于如下两条指令

    Sub esp,4   ;减法指令

    Mov [esp],eax  ;传送指令

     

    2)出栈指令:pop指令

    ESP逐渐增多

    源操作数在栈顶由ESP确定,pop指令只表达目的操作数,刚好与push指令相反

    ----------------------用法见一段指令-----------------

    ;出栈指令

    Pop eax   ;等同于如下两条指令

    Mov eax , [esp]   ;传送指令

    Add esp , 4       ;加法指令

     

    -----------------------综合:见一段堆栈操作程序-----------------------

    .data

    Ten = 10

    Dvar DEORD 67762000h , 12345678h

    .data

    Mov eax , dvar+4            ;eax=12345678h

    Push eax                   ;将eax里的内容压入堆栈

    Push DWORD ptr ten         ;将立即数以双字量压入堆栈

    Push dvar                  ;将变量的第一个数据压入堆栈

    Pop eax                    ;将栈顶数据弹出到eax

    Pop dvar+4                 ;栈顶数据弹出到DVAR+4的位置

    Mov ebx , dvar+4            ebx=0000000AH

    Pop ecx                    ;栈顶数据弹出到ecx

     

    应用堆栈的几点注意以及应用

    1、 注意:

    -------------由于堆栈的栈顶和内容随着程序的执行不断变化,所以编程时应该注意进栈和出栈的数据要成对,要保持堆栈平衡。

     

    --------------避免1632为两种传送单位的混用。

    2、 应用

    -------------堆栈指令、子程序调用指令CALL、子程序反回RET指令、中断调用INT指令、中断返回IRET等指令都会使用堆栈,修改ESP值。

     

    -------------用来存放数据,以便随时恢复它们,使用pop指令时明确栈顶的数据。

     

    -------------可以以随机的方式读取其中的数据,EBP就是以这个目的而设计(见一段代码)

    Mov ebp , esp

    Mov eax , [ebp+8]

    Mov [ebp] , eax

    ------------利用堆栈实现主程序与子程序间的传递参数

     

    ------------还常用于子程序的寄存器保护和恢复,进行快速的现场保护和恢复。

    1.3、  其他传送指令

    1)、地址传送指令:lEA

    -----------------------LEA 的一点重点-----------------------------

    -LEAoffset的区别

    LEACPU的指令,后面课跟标号、常量和表达式

    Offset伪指令,后面只能跟标号和常量

    ------------见一段代码

    Buffer dp 100 dup ( 0 )   ;开辟100个连续字节的的初始化为零的空间

                          ;dp WORDBYTE形式类似

                          ;buffer 类似数组名,指向的是数组的首地址

    .code

    Lea ebx , buffer             ;(送首地址)

    Mov ebx , offset  buffer     (送地址)

    Mov ebx , buffer      ;(送第一个数 )

    Lea ebx , [buffer+50]       ;(送地51个地址)

    Mov enx ,offset [buffer+50]    ;ERROR!buffer+50已经是地址,offset有送地址,乱套了!)

    一般来说:注意:

    mov reg , offset XXX 比 Lea reg , XX 的指令长度少一个字节,快一个时钟,但lea更灵活

                                                                                                                                         

    stay hungry stay foolish ----jobs 希望多多烧香!
  • 相关阅读:
    DVWA--SQL Injection(SQL注入)
    DVWA--Insecure CAPTCHA(不安全的验证码)
    DVWA--File Upload(文件上传)+中国菜刀下载及使用
    DWVA--File Inclusion(文件包含)
    DVWA--CSRF(跨站请求伪造)
    DVWA--Command Injection(命令行注入)
    2020.08.06【省选B组】模拟 总结
    2020.08.05【省选B组】模拟 总结
    2020.08.04【省选B组】模拟 总结
    jzoj 5251. 【GDOI2018模拟8.11】决战
  • 原文地址:https://www.cnblogs.com/bakari/p/2623699.html
Copyright © 2011-2022 走看看