zoukankan      html  css  js  c++  java
  • 汇编语言基础

    标志寄存器FLAGS

    15

    14

    13

    12

    11

    10

    9

    8

    7

    6

    5

    4

    3

    2

    1

    0

    OF

    DF

    IF

    TF

    SF

    ZF

    AF

    PF

    CF

    标志寄存器FLAGS

    CF:进位标志       PF:奇偶标志              AF:调整标志

    ZF:零标志          SF:符号标志              OF:溢出标志

    DF:方向标志      IF:中断允许标志        TF:陷阱标志

    r8/r16

    任意一个8/16位通用寄存器

    reg

    代表r8或r16

    seg

    段寄存器

    m8/m16

    一个8/16位存储器操作数单元(包括所有主存寻址方式)

    mem

    代表m8或m16

    i8/i16

    一个8/16位立即数

    imm

    代表i8或i16

    dest

    目的操作数

    src

    源操作数

    操作数代号

    一、通用数据传送指令

    1.    MOV

    mov reg/mem,imm              //注意不允许立即数传至段寄存器

    mov reg/mem/seg,reg //不能同时为存储单元

    mov reg/seg,mem         //IP不能为目的操作数

    mov reg/mem,seg         //不能直接改变CS的值,会引起程序执行混乱

    2.    XCHG:交换指令

    xchg reg,reg/mem        //不能为CS,CS不能更改,不能同时为段寄存器

    xchg reg/mem,reg        //不能同时为存储器

    3.    XLAT:换码指令用于将BX指定的缓存区中,al指定的位移处的数据取出赋值给al

    xlat label

    xlat                 ;al<-ds:[bx+al]

    二、堆栈操作指令

    1. PUSH:进栈指令

     push r16/m16/seg           ;SP<-SP-2,SS:[SP]<-r16/m16/seg              //低字节放低地址

    2. POP:出栈指令

      popr16/m16/seg

    三、标志传送指令

    (1)标志寄存器传送

    1. LAHF                ;AH<-FLAGS的低字节

    2. SAHF                ;FLAGS的低字节<-AH

    3. PUSHF              ;SP<-SP-2,SS:[SP]<-FLAGS

    4. POPF                ;FLAGS<-SS:[SP],SP<-SP+2

    (2)标志位操作

    clc

    CF<-0

    stc

    CF<-1

    cmc

    CF<-∽CF

    cld

    DF<-0

    std

    DF<-1

    cli

    IF<-0

    sti

    IF<-1

    四、地址传送指令

    1.LEA有效地址传送指令

           LEAr16,mem               ;r16<-mem的有效地址EA

    2.指针传送指令

           LDSr16,mem               ;r16<-mem,DS<-mem+2

           LESr16,mem                ;r16<-mem,ES<-mem+2

    五、算数运算符指令

           (1)加法指令

                  1.ADD

                  addreg,imm/reg/mem

                  addmem,imm/reg

                  2.ADC:带进位加法(同上)

                  3.INC增量指令

                  increg/mem

           (2)减法指令    

                  1.SUB(似ADD)

                  2.SBB(似ADC)

                  3.DEC(似INC)

                  4.NEG:求补指令(取反)

                         negreg/mem              ;reg/mem<-0-reg/mem

                  5.CMP:将目的操作数减去源操作数,但结果不送回目的操作数。引向标志。

                         cmpreg,imm/reg/mem              ;reg-imm/reg/mem

                         cmpmem,imm/reg                    ;mem-imm/reg

          (3)乘法指令

                  1.MUL:无符号数乘法指令

                         mulr8/m8                   ;无符号字节乘:AX<-AL*r8/m8

                         mulr16/m16                ;无符号字乘:DX.AX<-AX*r16/m16

                  2.IMUL:有符号数乘法指令

                         imulr8/m8                   ;有符号字节乘

                         imulr16/m16               ;有符号字乘

           (4)除法指令

                  1.DIV无符号除法

                         divr8/m8                     ;无符号除法:AL<-AX÷r8/m8的商

                                                            ;AH<-AX÷r8/m8的余数

                         divr16/m16                 ;无符号除法:AX<-DX.AX÷r16/m16的商

                                                            ;DX<-DX.AX÷r16/m16

                  2.IDIV有符号除法

                         idivr8/m8

                         idivr16/m16

           (5)符号扩展指令

                  1.cbw                                  ;AL符号扩展成AX

                  2.cwb                                  ;AX符号扩展为DX.AX

           (6)十进制调整指令

                  1.压缩BCD码调整指令

                         daa                              ;AL<-将AL中的加和调整为BCD码

                                                            ;在ADD/ADC AL,X ;语句之后对AL调整

                         das                              ;AL<-将AL中的减差调整为压缩BCD码

                         DAA和DAS指令对OF标志没有定义,按结果影响其他标志

                  2.非压缩BCD码指令

                         aaa                              ;AL<-将AL中的加和调整为非压缩BCD码

                         aas                              ;AL<-将AL中的减差调整为非压缩BCD码

                         aam                             ;AX<-将AX中的乘积调整为非压缩BCD码

                         aad                              ;AX<-将AX中的非压缩码扩展为二进制数

                                                            ;即:AL<-10*AH+AL,AH<-0

    三、位运算类操作

           (1)逻辑运算指令

                  1.逻辑与指令AND

                         anddest,src              ;dest<-dest^src,将两个操作数执行按位的逻辑与运算

                  2.逻辑或指令OR

                         ordest,src                 ;dest<-destVsrc

                  3.逻辑抑或指令XOR

                         xordest,src               ;dest<-dest⊕src

                  4.逻辑非指令NOT

                         notreg,mem             ;reg<-∽reg/mem

                  5.测试指令TEST

                         testdest,src               ;dest^src,对两个操作数执行按位与运算,但结果不回

    ;到目的数

           (2)位移指令

                  1.逻辑左移shl reg/mem,1/CL            ;补0

                  2.逻辑右移shr reg/mem,1/CL           ;补0

                  3.算术左移sal reg/mem,1/CL            ;补0

                  4.算数术右移sar reg/mem,1/CL        ;最高位不变

           (3)循环移位指令

                  1.不带进位

                         rolreg/mem,1/CL                    ;左移

                         rcrreg/mem,1/CL

                  2.带进位

                         rclreg/mem,1/CL                    ;右移

                         rcrreg/mem,1/CL

  • 相关阅读:
    dotnet core 获取 MacAddress 地址方法
    dotnet core 获取 MacAddress 地址方法
    dotnet core 发布只带必要的依赖文件
    dotnet core 发布只带必要的依赖文件
    Developing Universal Windows Apps 开发UWA应用 问答
    Developing Universal Windows Apps 开发UWA应用 问答
    cmd 如何跨驱动器移动文件夹
    cmd 如何跨驱动器移动文件夹
    C++ 驱动开发 error LNK2019
    C++ 驱动开发 error LNK2019
  • 原文地址:https://www.cnblogs.com/ke-yi-/p/10175869.html
Copyright © 2011-2022 走看看