指令系统

数据类型

汇编语言中可使用的数据类型有以下七种(80486):

1 无符号二进制数

  1. 字节(8位):0~255(0~FFH),占用一字节
  2. 字(16位):0~65535(0~FFFFH),占用连续的两字节,低地址存低8位,高地址存高8位。低字节的地址为该字的地址
  3. 双字(32位)0~4294967299(0~FFFFFFFFH),占用连续的四字节,最低8位存最低8位,最高8位存最高8位。最低字节的地址为该双字的地址。

2 有符号二进制数

  1. 字节:-127+127
  2. 字:-32768~+32767

3 浮点数

  1. 单精度(32位):符号位(1位)+阶码(10位)+1.有效数
  2. 双精度(64位):

4 BCD码

  1. 压缩BCD码:1字节存放两个BCD
  2. 非压缩BCD码:1字节存放一个BCD码(低四位BCD,高四位0或任意)

5 字符串

  1. 位串:从任意字节的任何位开始的相邻位序列,最长为 2^32-1
  2. 字节/字/双字串:是字节/字/双字的相邻序列,最长为 2^32-1

6 ASCII码

一个ASCII码占一个字节

7 指针数据

近指针(32位):32位的段内偏移地址,段内寻址时使用

远指针(48位):由16位选择符和32位偏移量组成,段间寻址时使用

寻址方式

1 立即寻址(较快)

指令的操作数紧跟操作码后,直接存放在代码段中,比如:

1
2
MOV BL, 56H; #Bl<--56H
MOV AX, 0A256H; #AX<---0A256H

立即数只能作源操作数,不能作目的操作数

2 寄存器寻址(最快)

操作数在 CPU 的寄存器中,寄存器名由指令指出。如: ``

1
2
INC CL;  #CL<--(CL)+1
MOV AX, BX; #AX<--(BX)

3 直接寻址(较快)

操作数有效地址1(16位or32位)直接包含在指令中,位于操作码之后,存放在代码段中。地址前面可以通过前缀指明在哪一个段,否则默认操作数存在数据段。

1
2
MOV AX, [2000H] ;DS段2000H内容送到AL,2001H内容送到AH
MOV AX, ES: [2000H] ;DS段2000H内容送到AL,2001H内容送到AH

4 寄存器间接寻址

操作数的偏移地址存放在寄存器中,而操作数放在存储器中。

1
2
MOV AX, [BX] ;AX<--(DS*10H+(BX))
MOV AX, ES: [BX] ;AX<--(DS*10H+(BX))

在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。后面都一样。

5 相对寄存器间接寻址

寄存器的内容与位移量之和形成操作数的有效地址1,即 EA=[寄存器]+偏移量

1
2
MOV AX, 2040H[BX] ;DS段(BX)+2040H中的字数据送到 AX
MOV AX, [BX+2040H] ;同上

6 基址加变址寻址

基址寄存器内容与变址寄存器内容之和形成操作数的偏移地址,即 EA=[基址寄存器]+[变址寄存器]

1
2
MOX AX, [BX+SI] ;DS段(BX)+(SI)中的字数据送到 AX
MOV AX, [BX][SI] ;同上

7 相对基址加变址寻址

基址寄存器内容与变址寄存器内容再加偏移量之和形成操作数的有效地址1,即 EA=[基址寄存器]+[变址寄存器]+偏移量

1
2
3
MOV AX, 1234H[BX+DI]
MOV AX, [BX+DI+1234H]
MOV AX, 1234H[BX]+[DI]; #DS段(BX)+(DI)+1234H 中的字数据送到 AX

2011061414060175

与跳转有关的寻址

  1. 无条件转移语句 JMP dst,dst为转移目标
  2. 有条件转移语句 CALL dst dst为调用目标

指令

高级语言中的一条语句对应多条指令。指令是计算机运行的最基本单位。

指令格式

1
[标号] 操作码 [操作数……] [;注释]

其中:

  1. 标号:确定汇编语言的位置,提供跳转、循环的目标
  2. 操作码:汇编语句操作
  3. 操作数:操作数据项,因操作码而异

为了方便未来描述指令,我们约定用以下符号:

符号 说明
OP1,OP2,OP3 操作数
reg 通用寄存器(8/16/32位)
reg8 8位通用寄存器
reg16 16位通用寄存器
reg32 32位通用寄存器
Sreg 段寄存器
mem 存储器(8/16/32位)
mem8 8位存储器
mem16 16位存储器
mem32 32位存储器
imm 立即数(8/16/32位)
imm8 8位立即数

相关标志(FLAGS)

标志 说明 标志状态 说明
CF 最高位进位/借位 X 表示相应标志位状态依运算或操作结果
AF 辅助进位/借位 0 表示相应标志位无条件清0
OF 溢出 1 表示相应标志位无条件置1
ZF 零标志 U 表示相应标志位状态未定义,状态随机
SF 符号标志 - 表示相应状态未状态不受影响,保存原状态
PF 奇偶标志,1的个数为偶置1    

指令分类

  1. 整数指令:数据传送、算数运算、逻辑与移位、串操作、位操作、控制转移、标志操作、按条件设置字节、处理器控制、高级语言指令等
  2. 浮点数指令:数据传送、算数运算、比较、超越函数、常量、控制等
  3. 操作系统型指令

指令系统

数据传送类指令

用于实现存储器与寄存器、寄存器与寄存器、累加器与IO端口之间,字节、字、双字的传送,也可将立即数据送到存储器或寄存器。这类指令基本上不影响标志位。

MOV(MOV)

格式:MOV OP1, OP2

功能:把 OP2 的内容传送到 OP1 中,OP1 和 OP2 为字节、字或双字

说明:

  1. 立即数只能作为源操作数,并且不能传给段
  2. 存储器和存储器之间以及段寄存器与段寄存器之间不允许传数
  3. 通用寄存器之间允许相互传数
  4. IP 不能操作数,CS不能作为目的操作数

交换寄存器 XCHG(Exchange)

格式:XCHG OP1, OP2

功能:用于交换两个操作数

说明:指令中的两个操作数可以是两个寄存器操作数,或一个寄存器与一个存储器操作数,不能是两个存储器。

IN/OUT

格式:IN OP1, OP2OUT OP1, OP2

功能:用于在 IO 端口和 AL、AX 或 EAX 累加器之间交换数据。IN 从 OP2 输入到 OP1,OUT 从 OP2 输出到 OP1。

说明:当IO地址大于 255时,应通过 DX 间接寻址。

装入有效地址 LEA(Load Effective Address)

格式: LEA OP1, OP2

功能:将有效地址(即偏移地址)送到通用寄存器

装入全地址

格式:

  • LDS reg, mem (Load DS with Pointer)指针送寄存器和DS
  • LES reg, mem(Load ES with Pointer)指针送寄存器和ES
  • LFS reg, mem
  • LGS reg, mem
  • LSS reg, mem

功能:其意义是同时给一个段寄存器和一个16位通用寄存器同时赋值

具体如下:reg16=mem32的低字,DS=mem32的高字

例如:

地址 100h 101h 102h 103h
内容 00h 41h 02h 03h

如果指令 LDS AX,[100h], 则结果为 AX=4100h DS=0302h

压栈/出栈

格式:PUSH OP1POP OP1

功能:PUSH 压入立即数/存储器/寄存器的数据;POP 取出数据到存储器或通用寄存器中。同时还会改变 SP 的值。

说明:不能用 MOV 代替。

全部压栈/出栈

格式:PUSHAPOPA

功能:将所有16位通用寄存器压入/取出堆栈。入栈的顺序为: AX、CX、BX、DX、SP、BP、SI、DI

标志寄存器转送

格式:

  1. LAHF (Load AH with flags)标志寄存器内容送AH指令
  2. SAHF (store AH into flags)AH内容送标志寄存器指令
  3. PUSHF (push the flags)16位标志寄存器内容进栈
  4. POPF(pop the flags) 出栈到16位标志寄存器

查表转换指令 XLAT(Translate)

格式:XLAT AL<–((BX)+(AL))

功能:BX 存放表的首地址,AL 存要查的序号,从而查表得到存储的内容,并存入 AL

1
2
3
MOV BX,DS
MOV AL,02H
XLAT; 把 [DS+02H] 放入 AL

算术运算类指令

算数运算会影响 FLAGS寄存器

加减 ADD/SUB

格式:

  • ADD OP1, OP2 OP1<–OP1+OP2
  • SUB OP1, OP2 OP1<–OP1-OP2

功能:OP1±OP2,结果送到 OP1

说明:判断溢出的方法:最高位和次高位要同时有进位/同时无进位。

带进/借位的加减 ADC/SBB

助记:ADC (add with carry) SBB(subtract with borrow)

格式:

  • ADC OP1, OP2 OP1<–OP1+OP2+CF
  • SBB OP1, OP2 OP1<–OP1-OP2-CF

功能:将 OP1、OP2、CF 相加,结果放在 OP1.减法同理。

说明:与 ADD/SUB 配合完成 32 位加减(低 16 位用 ADD/SUB,高 16 位用 ADC/SBB)

加1/减1 INC/DEC

格式:

  • INC OP1 OP1<–OP1+1
  • DEC OP1 OP1<–OP1-1

说明:常用于循环。

比较 CMP

格式:CMP DST,SRC (DST)-(SRC) 只影响标志位

功能:目的操作数 DST 减源操作数 SRC,结果只影响标标志位,不返回结果。

说明:CMP AX, BX

  • 无符号数比较
    1. CF=0
      1. ZF=0 AX>BX
      2. ZF=1 AX=BX
    2. CF=1 AX<BX
  • 有符号数比较
    1. OF=0
      1. SF=0 AX>BX
      2. SF=1 AX>BX
      3. ZF=1 AX=BX
    2. OF=1
      1. SF=0 AX<BX
      2. SF=1 AX>BX

交换加法指令

乘法

MUL(Unsigned Multiple)无符号数乘法

说明:

  • 8位乘法,内容放在AX
  • 16位乘法,内容放在DX(高位)AX(低位)

IMUL(Signed Multiple)带符号数乘法

乘法不允许使用立即数,除非是带符号的立即数乘法

除法

DIV(Unsigned divide)无符号数除法

IDIV(Signed divide)带符号数除法

说明:

  • 8位商AL余数AH
  • 16位商AX余数DX
  • 除以0,或者溢出均错误

逻辑运算类指令

逻辑运算指令

  • AND(and)逻辑与
  • OR(or)逻辑或
  • NOT(not)2的补码 逻辑非
  • NEG 1的补码
  • XOR(exclusive or) 异或
  • TEST(test)只改变标志寄存器的状态的AND 测试

移位指令

  • SHL(shift logical left)逻辑左移
  • SAL(shift arithmetic left) 算术左移
  • SHR(shift logical right)逻辑右移
  • SAR(shift arithmetic right) 算术右移

逻辑移位用于无符号数 算术移位用于有符号数。如果直接是 SHL AX,那就左移一位;如果是 SHL AX, CL,那就左移 CL 位。

1
2
3
mov ax,00010101
shl ax
;此时ax=00101010
  • ROL(Rotate left) 循环左移
  • ROR(Rotate right) 循环右移
  • RCL(Rotate left through carry) 带进位循环左移
  • RCR(Rotate right through carry) 带进位循环右移

循环指:最高位移到最低位(或反之);带进位循环指:最高位移到 CF,CF 移到最低位(或反之)

串处理指令

重复前端指令

  • REP(Repeat) 重复串操作直到(CX)=0为止
  • REPE(Repeat when empty) 若(CX)=0,则退出,否则CX=CX+1;
  • REPZ(Repeat when flag ) 若ZF=0,则退出,否则CX=CX+1;
  • REPC(Repeat when carry flag)
  • REPNE(Repeat when not empty)
  • REPNZ(Repeat when not zero flag)
  • REPNC(Repeat when not carry flag)

串操作指令

  • MOVSB (Move string of byte) ES:DI=ES:SI,DI=DI+1/-1,SI=SI+1/-1以字节为单位,串传送指令
  • MOVSW(Move string of word) ES:DI=ES:SI,DI=DI+2/-2,SI=SI+2/-2 以字为单位传送,串传送指令

ES 是 Extra Segment 附加段,DI 是目的变址寄存器,SI 是源变址寄存器。如果标志位的 DF(Direction Flag)是0,就加,反之减。

  • STOSB(Store string of byte) from al 存串指令
  • LODSB(Load string of byte) in al 取串指令
  • LODSW(Load string of word) in ax 取串指令

  • CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;
  • STD(Set direction flag) 该指令使DF=1,在执行串操作指令时可使地址自动减量.

  • INSB ES:DI=DX 串输入
  • OUTSB DX=ES:DI 串输出

  • DAA(Decimal adjust after addition) 组合BCD码的加法调整指令
  • DAS(Decimal adjust after substract) 组合BCD码的减法调整指令

  • MOVSX 8位转换16位数字 无符号用0填充
  • MOVZX 有符号用符号位填充

  • CMPSB(Compare string of byte) 存储单元和存储单元 串比较指令
  • SCASB(Scan string of byte) 存储单元和AX 串搜索指令

控制转移指令

无条件转移

JMP(jmp) 跳转指令

有条件转移

  • JZ(或JE)(Jump if zero,or equal) 结果为零(或相等)则转移
  • JS(Jump if sign) 结果为负则转移
  • JNS(Jump if not sign) 结果为正则转移
  • JO(Jump if overflow) 溢出则转移
  • JNO(Jump if not overflow) 不溢出则转移
  • JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0则转移
  • JP(或JPE)(Jump if parity,or parity even) 奇偶位为1则转移
  • JB(或JNAE,JC)(Jump if below,or not above or equal,or carry)低于,或者不高于或等于,或进位位为1则转移
  • JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry)不低于,或者高于或者等于,或进位位为0则转移

比较无符号数 转移

  • JB(或JNAE,JC)(Jump if below,or not above or equal,or carry)低于,或者不高于或等于,或进位位为1则转移
  • JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry)不低于,或者高于或者等于,或进位位为0则转移
  • JBE(或JNA)(Jump if below or equal,or not above)低于或等于,或不高于则转移
  • JNBE(或JA)(Jump if not below or equal,or above)不低于或等于,或者高于则转移

比较有符号数 转移

  • JL(或LNGE)(Jump if less,or not greater or equal)小于,或者不大于或者等于则转移
  • JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则转移
  • JLE(或JNG)(Jump if less or equal,or not greater)小于或等于,或者不大于则转移
  • JNLE(或JG)(Jump if not less or equal,or greater)不小于或等于,或者大于则转移

测试CX转移

JCXZ(Jump if CX register is zero) 测试CX的值为0则转移指令

循环

LOOP(loop) CX=0 循环指令

1
2
3
4
5
    MOV AX,0
    MOV CX,5
L1:
    INC AX
    LOOP L1

相当于(C语言):

for(AX=0,CX=5;CX!=0;CX-=1)
{
   AX+=1;
}

LOOPZ 为零跳转,只有在 ZF=1(zero flag)时跳转,并且如果 CX=0 则跳出循环。

1
2
3
4
5
    MOV AX,0
    MOV CX,5
L1:
    INC AX
    LOOPZ L1

相当于(C语言):

for(AX=0,CX=5;CX!=0 && ZF==0;CX-=1)
{
   AX-=1;
}

LOOPE 的功能和 LOOPZ 完全相同,实际上,这两个具有相同的操作码。


LOOPNZ 就与上面相反,只有在 ZF=0(zero flag)时跳转,并且如果 CX=0 则跳出循环。

1
2
3
4
5
    MOV AX,0
    MOV CX,5
L1:
    INC AX
    LOOPZ L1

相当于(C语言):

for(AX=0,CX=5;CX!=0 && ZF==1;CX-=1)
{
   AX-=1;
}

子程序

  • CALL(call) 将下一条指令的偏移地址压栈 调用指令
  • RET(return) 返回指令

中断

  • INT(interrupt)指令 4个字节=IP SI
  • IRET(interrupt return) 从中断返回指令
  • INTO(interrupt if overflow) 若溢出则中断

处理机控制指令

  1. 标志处理指令
    • CLC(Clear carry) 进位位置0指令CF<-0
    • CMC(Complement carry) 进位位求反指令CF<-CF
    • STC(Set carry) 进位位置1指令CF<-1
    • CLD(Clear direction) 方向标志置0指令DF<-0
    • STD(Set direction) 方向标志置1指令DF<-1
    • CLI(Clear interrupt) 中断标志置0指令IF<-0
    • STI(Set interrupt) 中断标志置1指令IF<-0
  2. 其他处理机控制指令
    • NOP(No Operation) 无操作
    • HLT(Halt) 停机
    • WAIT(Wait) 等待
    • ESC(Escape) 换码
    • LOCK(Lock) 封锁

伪指令

  1. 符号定义伪指令:
    • EQU
  2. 数据定义伪指令:
    • DB(Define Byte):定义字节
    • DW(Define Word):定义字
    • DD(Define Double):定义双字
    • DUP(duplication) :重复;复制,复写
  3. 过程定义伪指令:
    • PROC(Process):
    • ENDP
  4. 定位伪指令:
    • ORG(Origin ):
  5. 常数、变量及标号
    • OFFSET(Offset):偏移量
  6. 表达式和运算符:
    • 取值运算符:
      • SEG(Segment)
      • OFFSET(Offset)
    • 属性运算符:
      • PTR(Pointer):指针

一个汇编程序的基本框架:

1
2
3
4
5
6
7
8
9
10
11
12
13
DATA   SEGMENT
;存放数据
DATA   ENDS

CODE   SEGMENT
       ASSUME CS:CODE,DS:DATA
START: MOV AX, DATA
       MOV DS, AX
       ;程序主体
       MOV AH, 4CH
       INT 21H
CODE ENDS
END START
  1. 有效地址即偏移地址。  2 3