汇编语言基础

时间:2022-03-05 03:23:17

汇编语言基础

标志寄存器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