一.通用数据传送指令
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.条件转移指令
- 简单条件转移:这些指令根据单个标志位的状态而进行
| 标志位 | 指令 | 转移条件 | 含义 |
CF | JC | CF=1 | 有进位 |
JNC | CF=0 | 无进位(借位) | |
ZF | JE/JZ | ZF=1 | 相等/等于0 |
JNE/JNZ | ZF=0 | 不相等/不等于0 | |
SF | JS | SF=1 | 是负数 |
JNS | SF=0 | 是正数 | |
OF | JO | OF=1 | 有溢出 |
JNO | OF=0 | 无溢出 | |
PF | JP/JPE | PF=1 | 偶数个1 |
JNP/JPO | PF=0 | 奇数个1 |
- 无符号数条件转移指令:转移前,要使用比较指令对两无符号数进行比较(如A、B,进行A-B操作)。
| 指令 | 转移条件 | 含义 |
JA/JNBE | CF=0 AND ZF=0 | A>B |
JAE/JNB | CF=0 | A>=B |
JB/JNAE | CF=1 | A |
- 带符号数条件转移指令:
| 指令 | 转移条件 | 含义 |
JG/JNLE | ZF=0 AND SF=OF | A>B |
JGE/JNL | SF=0F | A>=B |
JL/JNGE | SF!=OF | A |
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,其他默认DS5.寄存器相对寻址方式
例: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中
One comment
666