汇编语言指令
数据传输类
- mov指令
格式:mov dst,src
mov指令是最常用的数据传送指令,传送对象可以是数据或地址
①dst、src数据类型需要一致(同为16位或8位)
②dst、src不能同时进行存储器寻址
③dst不能为数据段寄存器(DS)
④dst为段寄存器时(不为DS),src不能为立即数或段寄存器
- xchg指令
格式:xchg opr1,opr2
功能:将操作数opr1和opr2的内容互换
①数据类型需一致
②只能在通用寄存器/通用寄存器→存储单元之间进行交换
③不能采用立即寻址
- lea指令
格式:lea dst,src
功能:dst←src的偏移地址
①src必须是存储器寻址,dst必须是除段寄存器之外的16位寄存器
- xlat指令(查表指令)
格式:xlat
功能:AL←((BX)+(AL))将BX+AL的值位偏移地址访问数据段
,读一个字节的数据转给AL
- push和pop指令
①push和pop分别是堆栈的进栈和出栈操作指令
②堆栈区的高地址端为栈底,低地址端为栈顶
③汇编语言程序中所用的堆栈由堆栈端定义,堆栈段寄存器为ss,堆栈指针为16位寄存器sp,数据进栈与出栈均以字为单位进行
- push指令
格式:push opr1
将字类型操作数opr存入堆栈
①opr不能用立即寻址
②opr只能是字类型
- pop指令
格式:pop opr
将栈顶元素取出并存入字类型操作数opr
①②同上
③opr不能是代码段寄存器(CS)
例:如何将CS传递给DS?
push CS
pop DS
- in指令
格式:
in AL,PORT ;直接寻址方式,port为端口地址
in AL,DX ;间接寻址方式,DX内容为端口地址
in AX,PORT ;直接寻址
in AX,DX ;间接寻址
功能:输入指令,其功能是将I/O端口数据传送到AL或AX寄存器
- out指令
格式:
out PORT,AL ;直接寻址方式,port为端口地址
out DX,AL ;间接寻址方式,DX内容为端口地址
out PORT,AX ;直接寻址
out DX,AX ;间接寻址
功能:输出指令,其功能是将AL或AX寄存器中的数据传送到I/O端口
算数指令类(加减乘除)
加法类指令
- add指令
格式:add dst,src
功能:dst←(dst)+(src)
- adc指令
格式:adc dst,src
功能:dst←(dst)+(src)+CF
adc指令为带进位加法指令,即在普通加法的基础上加上CF标志值。
- inc指令
格式:inc opr
功能:opr←(opr)+1
也称为加一指令,用于计数和修改地址指针
①opr不能为立即数或段寄存器
②必须有明确数据类型(不能用[bx]之类的地址表示
③inc不会影响CF
减法类指令
- sub指令
格式:sub dst,src
功能:dst←(dst)-(src)
sub指令执行常规减法运算,使用上要求与add一致
- sbb指令
格式:sbb dst,src
功能:dst←(dst)-(src)-CF
sbb指令为带进位的减法指令,即在普通减法的基础上再减去前面指令产生的CF标志值。主要用于多字节数相减
- dec指令
格式:dec opr
功能:opr←(opr)-1
与inc详相似
- cmp指令
格式:cmp dst,src
功能:(dst)-(src)
也称为比较指令,执行一次减法运算,影响全部状态标准,但不保存运算结果
使用上要求与sub相同
通过对flags寄存器的值实现比较
- nec指令
格式:nec opr
功能:opr←0 -(opr)
也称为求补指令,用于求有符号数(补码表示)的相反数
opr不能为立即数或段寄存器,且必须有明确的数据类型
乘法类指令
- mul指令
格式:mul src
功能:mul为无符号数乘法指令。当src为字节类型数据时,被乘数默认为AL,乘积存放在AX中;当src为字类型数据时,被乘数默认为AX,乘积存放在DX:AX(乘积的高16位存于DX,低16位存于AX)。
举例:
mul BL ;AX←(AL)x(BL)
mul CX ;DX:AX←(AX)x(CX)
src不能为立即数或段寄存器,需要明确类型
影响CF和OF
除法类指令
- div指令
格式:div src ;src为除数,被除数隐含
功能:div为无符号数除法指令。当src为字节类型数据时,被除数默认为AX,商存放在AL中;当src为字类型数据时,被除数默认为DX:AX,商存放在AX,余数存于DX。
举例:
div BL ;(AX)/(BL)商存放在AL,余数存放在AH
div CX ;(DX:AX)/CX 商存放在AX,余数存放在DX
参考mul
当商超出了AL的表示范围,会出现除法溢出的情况,运行终止
逻辑运算类
- and指令
格式:and dst,src
功能:dst←(dst)∧(src)
dst和src做与运算 —— 0 ∧ x = 0 、1 ∧ x = x
会对CF、OF标志清零
- or指令
格式:or dst,src
功能:dst←(dst)∨(src)
- xor指令
格式:sub dst,src
功能:dst←(dst)⊕(src)
逻辑异或的运算指令:相同为0,不同为1
- not指令
格式:not opr
功能:opr←(opr)
逻辑非的运算指令:直接取反
- test指令
格式:test dst,src
功能:(dst)∧(src)
执行逻辑与and相同,但不保存运算结果,只影响条件标志
位移操作类指令
(1)逻辑左移指令:SHL DST,CNT
(2)逻辑右移指令:SHR DST,CNT
(3)算术左移指令:SAL DST,CNT
(4)算术右移指令:SAR DST,CNT
(5)循环左移指令:ROL DST,CNT
(6)循环右移指令:ROR DST,CNT
(7)带进位循环左移指令:RCL DST,CNT
(8)带进位循环右移指令:RCR DST,CNT
其中,DST是被移位的操作数,CNT是移位的次数
逻辑左移:最高位丢失,最低位补0
逻辑右移:最高位补0,最低为丢失
程序控制类指令
- 无条件转移指令
格式:jmp opr(改变cs:ip)
功能:按opr描述的转移地址,无条件转移到目标指令执行
举例:
jmp 02A5H:031AH; 把cs设置为02A5,IP设为031A
mov AX,3A14H
jmp AX; 把AX作为偏移地址加载到指针寄存器IP
- 条件转移指令
在满足特定条件下,转移到指定的目标指令处继续往下执行程序。不满足时直接按顺序执行
条件转移指令均为段内短距离转移指令。转移成功时,将IP修改为目标指令的偏移地址;转移失败时不改变IP
1)简单条件转移指令
只对单个条件标志进行检测,根据结果判断是否跳转
(1)格式:JC label
功能:若CF=1,则转移至label处,否则顺序执行。
(2)格式:JNC label
功能:若CF=0,则转移至Iabel处,否则顺序执行。
(3)格式:JZ/JE label
功能:若ZF=1,则转移至label处,否则顺序执行。
(4)格式:JNZ/JNE Iabel
功能:若ZF=0,则转移至label处,否则顺序执行。
(5)格式:JS label
功能:若SF=1,则转移至Iabel处,否则顺序执行。
(6)格式:JNS Iabel
功能:若SF=0,则转移至label处,否则顺序执行。
(7)格式:J0 label
功能:若OF=1,则转移至label处,否则顺序执行。
(8)格式:JNO label
功能:若OF=0,则转移至Iabel处,否则顺序执行。
(9)格式:JP/JPE label
功能:若PF=1,则转移至label处,否则顺序执行。
(10)格式:JNP/JPO label
功能:若PF=0,则转移至Iabel处,否则顺序执行。
2)无符号数比较转移指令
应该不考,先跳了orz,后面想学了再补上
3)有符号数比较转移指令
同上
- 循环指令
格式:loop label; lable为循环入口指令标号
功能:loop指令用于控制计数型循环,作为循环程序段的最后一条指令。循环计数器指定用CX寄存器,采用减一计数方式,初值为循环次数;CX未减到0时,转移到标号label处,继续循环,直到CX为0,循环结束
loop指令功能等效于下面两条指令:
dec DX
JNZ label
注意:loop指令转移范围为段内短距离转移
- 处理器控制类指令(一般不考)
这类指令用于强行设置某些标志,或改变处理器的某些工作方式
(1)格式:STC
功能:CF←1
(2)格式:CLC
功能:CF←0
(3)格式:CMC
功能:CF←CF取反
(4)格式:STD
功能:DF←1,控制串指针以减量方式修改
(5)格式:CLD
功能:DF←0,控制串指针以增量方式修改
(6)格式:STI;开中断指令
功能:IF←1,允许CPU响应外部可屏蔽中断请求
(7)格式:CLI;关中断指令
功能:IF←0,禁止CPU响应外部可屏蔽中断请求
(8)格式:HLT ;停机指令
功能:暂停CPU的工作,等待外部中断发生:(重新唤醒CPU)
(9)格式:NOP ;空操作指令
功能:该指令不执行任何有效操作,主要用于满足程序中的延时要求。
基本串指令
1)串传送(movs)类指令
MOVS类指令将源串指针所指的串元素值,传送到目的串指针所指的串元素位置。(功能跟mov基本一致)
(1)字节串传送指合MOVSB指令格式:MOVSB;源串和目的串地址隐含指令功能:该指令完成以下操作:
①传送一个字节:ES:DI←(DS:SI);
②)修改串指针:SI←(SI)±1,DI←(DI)±1
(2)字串传送指合MOVSW指令格式:MOVSW:源串和目的串地址隐含指令功能:该指令完成以下操作:
①传送一个字:ES:DI←(DS:SI);
②修改串指针:SI←(SI)±2,DI←(DI)±2