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

  • 相关阅读:
    Sphinx Search 学习 (一)
    求两个字符串最长子串的LCS算法 C语言实现(简短的实现函数)
    DPDK17.02入门手册
    DPDK2.1开发者手册4-7
    DPDK2.1开发者手册3-4
    DPDK2.1开发者手册1-2
    DPDK2.1 linux上开发入门手册
    深度优先搜索-linux上浅显易懂的例子
    多线程的电影
    数据对齐与代码优化笔记
  • 原文地址:https://www.cnblogs.com/ke-yi-/p/10175869.html
Copyright © 2011-2022 走看看