80x86的指令系统

一.通用数据传送指令

1、MOV(move) 传送

  (1)、格式为:MOV DST,SRC

       执行操作:(DST)<-(SRC)

       其中DST表示目的操作数,SRC表示源操作数

       DST不能使data

(2)、MOV指令的机器可以有7种格式:

  • MOV mem/reg1,mem/reg2 (mem表示存储器,reg表示寄存器)

     不允许两个操作数都为存储器;不允许指定段寄存器

  • MOV reg,data (data表示立即数)

     reg不允许是段寄存器

  • MOV ac,mem (ac表示累加器)
  • MOV segreg,mem/reg

     segreg为段寄存器,但不允许使用CS寄存器

  • MOV mem/reg,segreg
  • MOV mem/reg,data

     目的操作数只用存储器寻址方式而不用寄存器方式

data不能直接给段寄存器,段寄存器不能给段寄存器,所有指令中,最多只有一个操作数指定在存储器中

2、PUSH (push onto the stack) 进栈

(1)、格式为:PUSH SRC

执行操作:

​ 16位指令:(SP)<-(SP)-2 (SP指堆栈指针寄存器)

​ ((SP)+1,(SP))<-(SRC)

​ 32位指令:(ESP)<-(ESP)-4

​ ((ESP)+3,(ESP)+2,(ESP)+1,(ESP))<-(SRC)

(2)、PUSH指令的4种格式:

  • PUSH reg
  • PUSH mem
  • PUSH data
  • PUSH segreg

3、POP(pop from the stack) 出栈

(1)、格式为:POP DST

执行操作:

​ 16位操作指令:(DST)<-((SP)+1,(SP))

​ (SP)<-(SP)+2

​ 32位操作指令:(DST)<-((ESP)+3,(ESP)+2,(ESP)+1,(ESP))

​ (ESP)<-(ESP)+4

(2)、POP指令的允许格式:

  • POP reg
  • POP mem
  • POP segreg

POP指令目的为段寄存器时,不允许使用CS寄存器

4.XGHG指令

(1)、格式为:XCHG OPD,OPS

​ 指令功能:将源操作数和目的操作数的内容互换

不允许两个内存单元之间互换内容

5.XLAT查表指令

(1)、指令格式:XLAT TABLE 或 XLAT

​ 指令功能:把待查表格的一个字节内容送到AL累加器中。待查表格存于内存单元中,TABLE为待查表格的首地址

6.标志传送指令

  • 标志位送AH指令LAHF 不影响标志寄存器内容
  • AH送标志寄存器指令SAHF 影响PSW中的SF,ZF,AF,PF,CF
  • 标志进栈指令PUSHF 将Flag送sp所指的字节单元
  • 标志出栈指令POPF 将栈顶内容送标志寄存器

7.地址传送指令

(1)、有效地址指令LEA

​ 指令格式:LEA OPD,OPS

​ 指令功能:把OPS的偏移量送到OPD,对flag无影响

(2)、取地址指令LDS及LES

​ 指令格式:LDS OPD,OPS

​ LES OPD,OPS

​ 指令功能:将OPS所指向的存储单元的连续的4个字节的内容分别传送到OPD的DS寄存器或ES寄存器中


二、算术运算指令

1.加法指令

  • ADD加法
  • ADC带进位加法
  • INC加1

(1)、ADD加法指令

​ 指令格式:ADD OPD,OPS

​ 指令功能:OPD<--OPD+OPS

源操作数加上目的操作数,结果存于目的操作数中。二者不能同时为MEM

(2)、ADC带进位加法指令

​ 指令格式:ADC OPD,OPS

​ 指令功能:OPD<--OPD+OPS+CF

源操作数加上目的操作数再加上标志寄存器中CF的值,结果存于目的操作数中。二者不能同时为MEM

(3)、INC指令

​ 指令格式:INC OPD

​ 指令功能:OPD<--OPD+1

OPD可以是REG或者MEM,如果是内存单元需指定是字节或字单元

2.减法指令

  • SUB减法
  • SBB带借位减法
  • DEC减1
  • NEG求补
  • CMP比较

(1)、减法指令SUB

​ 指令格式:SUB OPD,OPS

​ 指令功能:目的操作数减源操作数,结果存于目的操作数,即OPD<--OPD-OPS

OPD,OPS不能同时位MEM,im只可以坐OPS

(2)、带借位减法指令SBB

​ 指令格式:SBB OPD,OPS

​ 指令功能:目的操作数减源操作数再减CF,结果存于目的操作数,即OPD<--OPD-OPS-CF

(3)、减1指令DEC

​ 指令格式:DEC OPD

​ 指令功能:OPD减1

不影响CF标志

(4)、求补指令NEG

​ 指令格式:NEG OPD (OPD可以是REG或MEM)

​ 指令功能:对操作数OPD进行求补运算,即对操作数OPD连同符合位求反后加1,并将结果放回OPD

(5)、比较指令CMP

​ 指令格式:CMP OPD,OPS

​ 指令功能:CMP指令与SUB指令类似,将两个操作数相减,但结果不回送OPD。该指令仅用于改变标志位。无符号数据比较时,CF=0表示OPD大于OPS,CF=1时表示OPS大于OPD;有符号数比较时,后面往往跟着一条转移指令,根据比较指令执行后标志寄存器的状态产生不同的分支。

3.乘法指令

  • MUL无符号乘法数指令
  • IMUL有符合乘法数指令

(1)、无符号数乘法指令MUL

​ 指令格式:MUL OPD 操作数可以是REG或MEM,不能使立即数

​ 指令功能:实现两个无符号数的乘法,当OPD为8位字节数据时为字节相乘,将AL寄存器与OPD相乘,结果存于AX寄存器,即AX<--(AL)*OPD,AL为隐藏操作数

​ 如果为16位默认与AX相乘,结果存于AX,DX

​ MUL DI ;DI与AX相乘

​ MUL BYTE PTR ALFA ;ALFA所指向的内存单元中的字节数据与AL相乘

对标志位的影响:影响CF、OF标志,如果乘积的高一半为0,则CF=OF=0,否则CF=OF=1

(2)、有符号乘法指令IMUL

​ 指令格式:IMUL OPD

​ 指令功能和用法和无符号类似。只是专用与有符号数相乘

​ 乘法指令对标志位的影响:如果乘积的高一半为低一半的符号扩展则CF=0;OF=0;否则CF=1,OF=1;

4.除法指令

  • DIV无符号除法
  • IDIV有符号除法

(1)、无符号除法指令DIV

​ 指令格式:DIV OPD,操作数可以是reg或mem,不能是立即数

​ 指令功能:实现两个无符号数的除法运算。当OPD为8位字节数据时为字节相除,被除数为在AX中,除数在OPD中。(AX)/OPD,AL<--商,AH<--余数,AX为隐含操作数

​ 当OPD是16位字节数据时字相除,被除数在DX和AX中,除数在OPD中。(DX)(AX)/OPD,AX<--商,

DX<--余数,AX,DX为隐含操作数

(2)、有符号数除法指令IDIV

​ 指令格式:IDIV OPD

​ 指令功能和无符号数除法类似,只是专用于有符号数的相除(同乘法)

5.逻辑运算指令

  • AND 逻辑与运算指令
  • OR 逻辑或运算指令
  • NOT 逻辑非运算指令
  • XOR 逻辑异或运算指令
  • TEST 测试指令

(1)、逻辑与运算指令AND

​ 指令格式:AND OPD,OPS

​ 指令功能:对两个操作数执行逻辑与运算,结果送到目的操作数,即OPD&OPS->OPD

​ 对标志位的影响:设置结果确定CF=OF=0,根据SF,ZF和PF状态,AF未定义

(2)、逻辑或运算指令OR

​ 指令格式:OR OPD,OPS

​ 指令功能:对一个操作数执行逻辑或运算,结果送到目的操作数,OPD|OPS->OPD

​ 对标志位的影响:同AND

(3)、逻辑非指令NOT

​ 指令格式:NOT OPD

​ 指令功能:对一个操作数执行逻辑非运算。不影响标志位

(4)、逻辑异或运算XOR

​ 指令格式:XOR OPD,OPS

​ 指令功能:对两个操作数执行逻辑异或运算,结果送到目的操作数,对标志位影响同AND

(5)、测试指令TEST

​ 指令格式:TEST OPD,OPS

​ 指令功能:对两个操作数执行逻辑与运算,结果不回送到目的操作数。OPD&OPS,结果不回送到OPD,仅建立结果状态标志。(测试一个数的某一位或某几位状态)

6.移位指令

(1)、一般移位指令

  • SAL / SHL OPD,OPS ;算术/逻辑左移,操作数左移,最低位补0,最高位进CF
  • SAR OPD,OPS ;算术右移,操作数右移,最高位不变,最低位进CF
  • SHR OPD,OPS ;逻辑右移,操作数右移,最高位补0,最低为进CF

OPS除了1,其他数都必须用寄存器

对标志位的影响:对AF无定义。CF为移后的值确定,并根据移位后的结果设置SF、ZFPF;当移动1位时,移位后如果符号位发生变化,则OF=1,符号位不发生变化,则OF=0,移位次数大于1时,移位次数大于1时,OF不确定。左移做倍减运算。

(2)、循环移位指令

  • ROL OPD,OPS ;不带进位循环左移
  • ROR OPD,OPS ;不带符号循环右移
  • RCL OPD,OPS ;带进位循环左移
  • RCR OPD,OPS ;带进位循环右移

同一般移位指令一样

三、汇编语言基本格式

1.段的定义

  • 格式:

段名 segment [定位类型] [组合类型] [类别名]

......语句 (程序或数据)

段名 ends

  • 段名:自定。
  • 定位类型:

(1)PARA:段地址起始于小段边界(16的倍数),此为默认(xxxx0)

(2)PAGE:段地址起始于页边界(256的倍数),(xxx00)

(3)WORD:起始于偶地址。

(4)BYTE:起始于任一字节

  • 组合类型:指定段与段之间如何连接和定位

(1)PRIVATE:无连接关系

(2)PUBLIC:在满足定位类型的前提下,该段与不同模块中的同名段连接在一起,形成一个新的逻辑段,公用段基,偏移量调整为相对于新逻辑段的起始地址。

(3)COMMON:本段与其他模块的同名段共享相同存储区

(4)STACK:所有同名段连接成(覆盖)一个连续段,且系统自动对SS初始化为此段首地址,并初始化SP,用户程序中至少有一段用STACK说明,否则用户要自己初始化SS和SP。

(5)AT表达式:本段可定位在表达式所指边界

(6)MEMORY:表示本段在内存中定位于所有其他段的最高地址,若有多个MEMORY,则把第一个遇到的作MEMORY处理,其他按PUBLIC处理。

  • 类别名:PUBLIC、COMMON
  • 段寻址操作:

Assume 段寄存器名:段名,段寄存器名:段名,......

2.指令语句

1.DUP表达式:

变量名 DB/DW/DD 重复次数 DUP(重复内容)

2.标号:是一条目标代码的符号地址,常用作转移指令的操作数

名称 LABEL 类型

SUB1_FAR LABEL FAR

标号距离属性:NEAR(表示转移和调用只能在本逻辑段,即段内转移)、FAR(表示可段间转移)。不加说明默认为NEAR

3.EQU:等值语句

格式:符号 EQU 表达式

功能:把表达式的值或符号赋给EQU左边的符号,不可重定义

等号语句功能同EQU,但可重复定义

4.支持的算术逻辑关系运算符号

  • 支持算术+、—、*、/、MOD、SHR、SHL、[](下标)等运算符操作
  • 支持按位逻辑运算:NOT、AND、OR、XOR
  • 支持关系运算符:EQ、NE、LT、LE、GT、GE

5.SEG运算符:得到变量或标号所在段的段基址

MOV AX,SEG K1

若k1所在段段基址为0915H,则AX中放0915H

6.OFFSET运算符:得到变量或标号的段内偏移量

MOV SI,OFFSET DA1

DA1偏移量为10H,则SI种放10H

7.LENGTH运算符:用于变量,得到数组变量的元素个数。若变量用DUP说明,则返回DUP外层值,没有DUP则返回1。

8.SIZE运算符:用于变量,返回数组变量所占总字节数,且等于LENGTH和TYPE两运算符值的积。

8.PTR运算符:

格式:类型 PTR 地址表达式

地址表达式为要修改类型属性的标号、变量或用做地址指针的寄存器。PTR含义是为地址表达式确定的存储单元指定类型(BYTE、WORD、DWORD、NEAR、FAR等)。这种修改时临时性的,仅在该语句内有效

9.This运算符

格式:This 类型

作用:把运算符后面指定的类型属性赋给当前的存储单元,而段和偏移属性不变。

DA_BYTE EQU This BYTE

DA_WORD DW 20H DUP(0)

第二个语句定义20H个字,若要以字节形式访问之,可以引用DA_BYTE变量名,即DA_BYTE和DA_WORD有相同段和偏移属性

10.定位位指令(ORG)和当前位置计数器($)

$用于记载当前偏移量,即当前位置计数器。

ORG格式为:ORG 表达式

四、程序设计

1.分支程序设计

1.无条件转移指令

格式:JMP 目标

功能:使程序无条件转移到目标出。目标同常用标号表述。

2.条件转移指令

  • 简单条件转移:这些指令根据单个标志位的状态而进行

| 标志位 | 指令 | 转移条件 | 含义 |

CFJCCF=1有进位
JNCCF=0无进位(借位)
ZFJE/JZZF=1相等/等于0
JNE/JNZZF=0不相等/不等于0
SFJSSF=1是负数
JNSSF=0是正数
OFJOOF=1有溢出
JNOOF=0无溢出
PFJP/JPEPF=1偶数个1
JNP/JPOPF=0奇数个1
  • 无符号数条件转移指令:转移前,要使用比较指令对两无符号数进行比较(如A、B,进行A-B操作)。

| 指令 | 转移条件 | 含义 |

JA/JNBECF=0 AND ZF=0A>B
JAE/JNBCF=0A>=B
JB/JNAECF=1A
  • 带符号数条件转移指令

| 指令 | 转移条件 | 含义 |

JG/JNLEZF=0 AND SF=OFA>B
JGE/JNLSF=0FA>=B
JL/JNGESF!=OFA

2.循环程序设计

1.LOOP指令

格式:LOOP 目标

功能:执行LOOP,则在进行循环计数后即(CX)<-(CX)-1后,若(CX)!=0则程序转到目标处,否则顺序执行

2.LOOE/LOOPZ指令

格式:LOOPE 目标

功能:执行LOOPE/LOOPZ,则在进行循环计数后即(CX)<-(CX)-1后,若(CX)!=0且ZF=1则程序转到目标处,否则顺序执行。

3.LOOPNE/LOOPNZ指令

格式:LOOPNE 目标

​ LOOPNZ 目标

功能:执行LOONPE/LOOPNZ,则在进行循环计数后,若(CX)!=0且ZF=0则程序转到目标处,否则顺序执行。

4.JCXZ指令

格式:JCXZ目标

功能:CX=0转目,否则顺序。此为:跳转指令。

3.调用与返回指令

1.调用指令

格式:CALL 过程名

CALL后要保留断点,即A1,B1处地址,以便返回。调用可段内,段间,可直接可间接。例:CALL BX ;起始地址在BX中

2.返回指令

格式:(1) RET

​ (2) RET n

执行CALL时,对段内调用,压入IP,对段间调用压入CS和IP;执行RET时,对段内调用,弹出一字送IP,段间调用弹出两字送IP和CS


附页一、寻址方式

1.立即寻址方式

例:MOV AX,20H

2.寄存器寻址方式

例:MOV AX,BX

3.直接寻址方式

例:MOV AX,[2000H] ;如果(DS)=3000H,则(AX)=(32000H)

​ MOV AX,VALUE ;可以用符号代替数值地址

4.寄存器间接寻址方式

例:MOV AX,[BX] ;如果(DS)=2000H,(BX)=1000H,则(AX)=(21000H)

注:源操作数(也就是[]中可用)可用寄存器BX,BP,SI,DI(16位寻址),在32位中使用(ECX,EDX,ESP,EBP,ESI,EDI),使用BP,ESP,EBP其默认段为SS,其他默认DS

5.寄存器相对寻址方式

例:MOV AX,COUNT[SI] ;如果(DS)=3000H,(SI)=2000H,COUNT=3000H,则(AX)=(35000H)

6.基址变址寻址方式

例:MOV AX,[BX][DI] ;如(DS)=2100H,(BX)=0158H,(DI)=10A5H,则(AX)=(21000H+0158H+10A5H)

7.相对基址变址寻址方式

例:MOV AX,MASK[BX][SI] ;如果(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H,

则(AX)=(33250H)

8.比例变址寻址方式

例:MOV EAX,COUNT[ESI*4] ;把双字数组COUNT中的元素3送到EAX中

Last modification:December 20th, 2020 at 04:40 pm