• 汇编指令简单指令简介


    计算机是通过执行指令来处理各种数据的。为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:

    1)操作码。它具体说明了操作的性质及功能。一台计算机可能有几十条至几百条指令,每一条指令都有一个相应的操作码,计算机通过识别该操作码来完成不同的操作。

    2)操作数的地址。CPU通过该地址就可以取得所需的操作数。

    3)操作结果的存储地址。把对操作数的处理所产生的结果保存在该地址中,以便再次使用。

    4)下条指令的地址。

    一条指令实际上包括两种信息即操作码和地址码。操作码(OperationCode,OP)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。地址码用来描述该指令的操作对象,它或者直接给出操作数,或者指出操作数的存储器地址或寄存器地址(即寄存器名)。

    指令包括操作码域和地址域两部分。根据地址域所涉及的地址数量,常见的指令格式有以下几种。

    ①三地址指令:一般地址域中A1、A2分别确定第一、第二操作数地址,A3确定结果地址。下一条指令的地址通常由程序计数器按顺序给出。

    ②二地址指令:地址域中A1确定第一操作数地址,A2同时确定第二操作数地址和结果地址。

    ③单地址指令:地址域中A 确定第一操作数地址。固定使用某个寄存器存放第二操作数和操作结果。因而在指令中隐含了它们的地址。

    零地址指令:在堆栈型计算机中,操作数一般存放在下推堆栈顶的两个单元中,结果又放入栈顶,地址均被隐含,因而大多数指令只有操作码而没有地址域。

    ⑤可变地址数指令:地址域所涉及的地址的数量随操作定义而改变。如有的计算机的指令中的地址数可少至 0个,多至6个。

     

    mov指令解析

    列如 mov  ax,cx 89c8   1000 1001 1100 1000

    Xxxx xxxx(前八位表示指令) xx(表寻址方式) xxx(操作数2 bx)xxx(操作数1 ax)

    表寻址方式:

    11表示两个寄存器  后面跟着两个操作数   其他的和后面三位配合表示寻址方式

    00 表示内存到寄存器

    01 表示内存加寄存器+16位

    10 表示内存到寄存器+64位

     

    数据传送指令

    Mov 无法内存到内存的传送

    一般传送都需要一个为寄存器

    Mov al byte ptr ds[200h]

    告诉编译器区多大

    Mov ax ds[200H]

    必须明确寄存器的位置

     

    Xchg  两数交换

    Xchg axbx

     

    换码指令

    Xlat(等价于下标寻址)

    Table db a , b,c

    Mov bxoffset Table

    Mov al0

    Xlat   al= 61H

     

    为什么要入栈,寄存器不够用

    Push  入栈  

    Pop  出栈

    假设栈顶为1000h  栈的位置就是0ffe   00 00 两个字节用作传参

    站必须在模16的位置

      Sub sp2

    Push  ax =  mov bx , sp

      Mov [bx],ax

     

        Mov bx, sp

    Pop  ax =》   mov ax ,[bx]

      Add sp ,2

     

    程序为了兼容,执行最后保存环境

    Push axpop  ax

    Pushf popf

    保存标志恢复标志

     

    Lahf  加载ahflag   读取

    Sahf  存储ahflag   写入

    只能修改低位  重要标志位都在低位

     

    Lea 地址传送(用来做运算块)

    多数用于加法和乘法

    Lea axds[bx + 200h];ax = bx + 200h

    Lea axds[bx + 200h*8];ax = bx + 200h*8

     

    Les  切换段寄存器  es

    Lds 切换段寄存器 ds

     

    In  out指令  特权指令

    可以控制地址总线的输入和输出

    现在的系统都已经禁止此命令

     

     

     

    复杂指令集 inter  amd

    精简指令集  arm

     

    分配段控件

    Debug调试器中

    Mov ax,1000

    Mov ds, ax

    Mov es, ax (将数据和附加数据段放在一起)

    可以分配其他空间,但是代码段是程序一开始就分配好的,改变不了,改变了后,系统会发现对应的地方无效操作码系统会崩

    无法控制代码加载到内存的位置,所以将内存分段交给操作系统。

    可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。

     Test指令

    Test ax,  8000h    ; 与ax做与运算 ax的值不变

    Test ax ,  ax  判断是否为零   指令周期最快

    Test ax ,  1 ;判断标志位   影响 zf 标志位

     

    Rol 左循环位移高位放到cf 和最低位

    Ror 右循环位移低位放到高位和cf

     

    mov  ax  ,  0ffeeh

    mov  cl   ,  8  (次数)

    rol   ax   ,  cl   ;结果  ax =  0eeffh

     

    带进位的循环移位 32位的移位  将高位放在cf中寄存

    Rcl带进位的左循环移位

    Rcr带进位的右循环移位

    32位移位

    Shl ax,1

    Rcl ax, 1

    Shr ax,1

    Rcr ax1

     

     

    压缩到不压缩不压缩到压缩

    Ax = 00ffh     ax= 0f0fh

    And al,0fhAxd al,0fh

    Mov ah,al Shl ah,4

    And ah,0f0hOr al,ah

    Shl ah,4

     

    串操作指令

    Cld指令后   df = 0  地址加    df方向标志位

    STD,将方向标志位DF置1

    Movs 把字节操作数从源地址传送到目的地址

    Mov si ,offset SI

    Mov di ,offset DI

    Mov cx,4

    ;没有rep指令 一般都是repz

    Repz    2个周期指令

    Movsb拷贝一个字节

    Movsw拷贝两个字节  在后面继续拷贝  

     

    串存储STOS

    ALAX数据传送至目的地址

    STOSB    字节串存储:ES:[DI]←AL

    STOSW   字串存储:ES:[DI]←AX

     

    串读取LODS 用于比较

    把指定主存单元的数据传送给ALAX

    LODSB    字节串读取:AL←DS:[SI]

    LODSW  字串读取:AX←DS:[SI]

     

    串比较CMPSmemcpy

    将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系

    CMPSB  字节串比较:DS:[SI]ES:[DI]

    CMPSW字串比较:DS:[SI]ES:[DI]

     

    串扫描SCASstrlen

    AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系

    SCASB字节串扫描:ALES:[DI]

    SCASW     字串扫描:AXES:[DI]

     

    REP重复前缀指令

    REP每执行一次串指令,CX1

    直到CX0,重复执行结束

    REP前缀可以理解为:当数据串没有结束(CX≠0),则继续传送

     

    REPZ每执行一次串指令,CX1相等重复

    (需要将并判断ZF是否为0

    cx走完)只要CX0ZF0,重复执行结束

     

    REPNZ          每执行一次串指令,CX1不相等重复

    cx可以     并判断ZF是否为1

    提前结束)     只要CX0ZF1,重复执行结束

     

    无条件转移指令

    JMP/Jcc/LOOP  CALL/RET

     

    JMP指令分成4种类型:

    ⑴  段内转移、直接寻址

    ⑵  段内转移、间接寻址

    ⑶  段间转移、直接寻址

    ⑷  段间转移、间接寻址

     

    段内转移  同一段中跳转  

    汇编中没有 jmp TABLE(标号)  是宏编译器帮忙识别添加short near

    Jmp又称伪指令

     

    段内转移——近转移(nearjmp  near ptr TABLE( 标号 )e9表示跳转

    在当前代码段64KB范围内转移( ±32KB范围)

    不需要更改CS段地址,只要改变IP偏移地址

     

    段内转移——短转移(shortjmp  short  TABLE( 标号 ) eb表示跳转

    转移范围可以用一个字节表达,在段内-128~+127范围的转移

     

    段间转移  不同段相互跳转操作

    jmp  far  ptr  TABLE( 标号 )ea表示跳转 前四个表ip 后四个表段  

    段间转移——远转移(far

    从当前代码段跳转到另一个代码段,可以在1MB范围

    需要更改CS段地址和IP偏移地址

    目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址

     

    ~~~花指令   90 给一个字节的指令来解花指令

     

    Edit 编辑器

    注释  或者/**/

    Mystack segment stack 

    Db 256  dup(?)

    Db定义数据类型  dup初始化内存 ?随机 全为0

    Mystack ends

     

    Mydate segment

    ;Db 256  dup(?)   如果不写就是默认写的字节数大小

    MSG dbhello world$

    Mydate ends

     

    Mycode segment

    START   ; (程序入口 告诉计算机执行代码开始处)

    Mov ax,Mydate (标识代表位置)

    Mov dsax

    Mov esax

    Mov axMystack

    Mov ssax

    Mov ah09h

    Mov dxoffset MSG offset自动算数据区偏移

    Int 21

    ;exit   系统写的特殊退出码

    Mov ax04c00h

    Int 21

     

    Mycode ends

    End  START 

    ;end 告诉编译器结束了

    计算机是通过执行指令来处理各种数据的。为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:

    1)操作码。它具体说明了操作的性质及功能。一台计算机可能有几十条至几百条指令,每一条指令都有一个相应的操作码,计算机通过识别该操作码来完成不同的操作。

    2)操作数的地址。CPU通过该地址就可以取得所需的操作数。

    3)操作结果的存储地址。把对操作数的处理所产生的结果保存在该地址中,以便再次使用。

    4)下条指令的地址。

    一条指令实际上包括两种信息即操作码和地址码。操作码(OperationCode,OP)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。地址码用来描述该指令的操作对象,它或者直接给出操作数,或者指出操作数的存储器地址或寄存器地址(即寄存器名)。

    指令包括操作码域和地址域两部分。根据地址域所涉及的地址数量,常见的指令格式有以下几种。

    ①三地址指令:一般地址域中A1、A2分别确定第一、第二操作数地址,A3确定结果地址。下一条指令的地址通常由程序计数器按顺序给出。

    ②二地址指令:地址域中A1确定第一操作数地址,A2同时确定第二操作数地址和结果地址。

    ③单地址指令:地址域中A 确定第一操作数地址。固定使用某个寄存器存放第二操作数和操作结果。因而在指令中隐含了它们的地址。

    零地址指令:在堆栈型计算机中,操作数一般存放在下推堆栈顶的两个单元中,结果又放入栈顶,地址均被隐含,因而大多数指令只有操作码而没有地址域。

    ⑤可变地址数指令:地址域所涉及的地址的数量随操作定义而改变。如有的计算机的指令中的地址数可少至 0个,多至6个。

     

    比如 mov  ax,cx 89c8   1000 1001 1100 1000

    Xxxx xxxx(前八位表示指令) xx(表寻址方式) xxx(操作数2 bx)xxx(操作数1 ax)

    表寻址方式:

    11表示两个寄存器  后面跟着两个操作数   其他的和后面三位配合表示寻址方式

    00 表示内存到寄存器

    01 表示内存加寄存器+16位

    10 表示内存到寄存器+64位

     

    复杂指令集 inter  amd

    精简指令集  arm

     

    分配段控件

    Debug调试器中

    Mov ax,1000

    Mov ds, ax

    Mov es, ax (将数据和附加数据段放在一起)

    可以分配其他空间,但是代码段是程序一开始就分配好的,改变不了,改变了后,系统会发现对应的地方无效操作码系统会崩

    无法控制代码加载到内存的位置,所以将内存分段交给操作系统。

    可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。

     

    Edit 编辑器

    注释 或者/**/

    Mystack segment stack

    Db 256  dup(?)

    Db定义数据类型  dup初始化内存 ?随机 0 全为0

    Mystack ends

    Mydate segment

    ;Db 256  dup(?)   如果不写就是默认写的字节数大小

    MSG dbhello world$

    Mydate ends

    Mycode segment

    MJ     (程序入口 告诉计算机执行代码开始处)

    Mov ax,Mydate (标识代表位置)

    Mov dsax

    Mov esax

    Mov axMystack

    Mov ssax

    Mov ah09h

    Mov dxoffset MSGoffset自动算数据区偏移

    Int 21

    ;exit   系统写的特殊退出码

    Mov ax04c00h

    Int 21

     

    Mycode ends

    End  MJ

    ;end 告诉编译器结束了

     

    寻址会极大的降低性能

    学如逆水行舟,不进则退。 博客园技术交流群 群 号:1073255314 (本群没人,刚刚建立 -_-!!! )
  • 相关阅读:
    如何还原Microsoft Office Word 2003默认的Normal.dot模板文件
    如何解决VMware Workstation 10.0.0 build-1295980马赛克现象
    通过更改注册表信息来恢复Microsoft Office 2003默认设置
    在运行Eclipse时明确指定要使用的Java VM
    修改Eclipse启动图像
    Get IPv4 Address 1.0
    hosts appender 2.0
    Extract String From Text 1.0
    String Replace 1.0
    360 Extension for Chrome Download 1.0
  • 原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13618658.html
Copyright © 2020-2023  润新知