学习笔记——从零开始速通汇编(三):数据传送类&算术运算类指令系统
导航
✨学习笔记——从零开始速通汇编(一):寄存器 | JinYu🐟
🎉学习笔记——从零开始速通汇编(二):汇编程序语句结构&寻址方式 | JinYu🐟
🎊学习笔记——从零开始速通汇编(三):数据传送类&算术运算类指令系统 | JinYu🐟
🎃学习笔记——从零开始速通汇编(四):逻辑运算与移位操作类指令系统 | JinYu🐟
🎄学习笔记——从零开始速通汇编(五):程序控制类&串操作类指令系统 | JinYu🐟
学习笔记——从零开始速通汇编(三):数据传送类&算术运算类指令系统
前言:
正式进入指令系统学习
数据传送类指令:
数据传送类指令用于在寄存器之间、寄存器与存储单元之间或CPU与I/O端口之间传送信息,传送的信息位数据或地址
MOV指令
指令格式:MOV DST,SRC
指令功能:MOV指令是最常用的数据传送指令,其传送对象可以是数据,也可以是地址
注意:
- DST和SRC数据类型必须保持一致
- SRC可以使用寄存器立即寻址和各种存储器寻址方式,DST只能采用寄存器寻址和各种存储器寻址方式
- DST和SRC不能同时采用存储器寻址
- DST不能是CS
- 当DST为段寄存器时(除CS),SRC不能为立即数或段寄存器
XCHG指令
指令格式:XCHG OPR1,OPR2
指令功能:将操作数OPR1和OPR2的内容互换
注意:
- 数据类型一致
- XCHG只能在通用寄存器之间或通用寄存器和存储单元之间进行交换
- 不能采用立即寻址
LEA指令
指令格式:LEA DST,SRC
指令功能:DST←SRC的偏移位置
注意:
- SRC必须是存储器寻址
- DST必须是除段寄存器外的16位寄存器
LEA SI,[BX+6]与MOV SI,OFFSET[BX+6]不能等效,因为OFFSET是运用于汇编过程的,而在汇编中,[BX+6]的值是未知的
XLAT指令(查表指令)
指令格式:XLAT
指令功能:AL←((BX)+(AX))
PUSH和POP指令
PUSH和POP分别是堆栈的进栈和出栈操作指令
堆栈区的高地址端称为栈底,低地址端称为栈顶
汇编语言程序中所用的堆栈由堆栈段定义,堆栈段寄存器为SS,堆栈指针为16位寄存器SP,数据进栈与出栈均以字为单位进行
PUSH指令
指令格式:PUSH OPR
指令功能:将字类型操作数OPR存入堆栈
PUSH指令的操作可表示为以下两步:
SP←(SP)-2
(SP)←OPR
注意:
- OPR不能用立即数寻址
- OPR一定是字类型
POP指令
指令格式:POP OPR
指令功能:将栈顶元素去除并存入字类型操作数OPR
POP指令的操作可表示为以下两步:
OPR←((SP))
SP←(SP)+2
注意:
- OPR不能用立即数寻址
- OPR一定是字类型
- OPR不能是代码段寄存器CS
IN指令
指令格式:
- IN AL,PORT 直接寻址方式,PORT为端口地址
- IN AL,DX 间接寻址方式,DX的内容为端口地址
- IN AX,PORT 直接寻址方式,PORT为端口地址
- IN AX,DX 间接寻址方式,DX的内容为端口地址
指令功能:输入指令,其功能是将I/O端口的数据传送到AL或AX寄存器
例:要从61H端口输入数据
IN AL,61H
例:要从61H和62H两个端口输入数据
IN AX,61H
例:要从300H端口输入数据
MOV DX,300H
IN AL,DX
OUT指令
与IN指令相反
算术运算类指令:
加法类指令
ADD指令
指令格式:ADD DST,SRC
指令功能:DST←(DST)+(SRC)
注意:
- 类型一致
- DST和SRC不能同时采用存储器的存储方式
- DST和SRC均不能为段寄存器
ADC指令
指令格式:ADC DST,SRC
指令功能:DST←(DST)+(SRC)+CF
ADC指令为带进位加法的指令,即在普通加法的基础上再加上此前的指令所产生的CF标志值
该指令主要用于多字节数相加
注意:
- 类型一致
- DST和SRC不能同时采用存储器的存储方式
- DST和SRC均不能为端寄存器
INC指令
指令格式:INC OPR
指令功能:OPR←(OPR)+1
INC指令也称加1指令,常用于计数和修改地址指针
注意:
- OPR不能为立即数或者段寄存器
- OPR必须有明确的数据类型
- 不影响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
DEC指令也称减1指令,常用于计数和修改地址指针
DEC指令在使用上的要求与INC指令完全相同
相对于INC指令的顺计数,DEC指令的倒计数在汇编语言设计中用的更多(如循环计数)
CMP指令
指令格式:CMP DST,SRC
指令功能:(DST)-(SRC)
CMP指令称为比较指令,CMP指令执行一次减法运算,影响全部状态标志,但不保存运算结果
CMP指令在使用上的要求与SUB指令完全相同
CMP时比较指令,但其本身并不能完成这种比较,它只是通过设置各种条件标志为实际的比较提供条件(实际的比较由专门的指令完成)
NEG指令
指令格式:NEG OPR
指令功能:OPR←0-(OPR)
NEG指令也称求补指令,用于求有符号数(以补码表示)的相反数,各状态标志按0-(OPR)运算来设置
OPR不能为立即数或段寄存器,且必须有明确的数据类型
乘法类指令
MUL指令
指令格式:MUL SRC SRC为乘数,被乘数隐含
指令功能:MUL为无符号数乘法指令。当SRC为字节类型数据时,被乘数默认为AL,乘积存于AX;当SRC为字类型数据时,被乘数默认为AX,乘积存于DX:AX(即乘积的高16位存于DX,低16位存于AX)
例:
MUL BL;AX←(AL)×(BL)
MUL CX;DX:AX←(AX)×(CX)
注意:
- SRC不能是立即数或段寄存器
- SRC必须有明确的数据类型
- MUL指令影响CF和OF
IMUL指令
指令格式:IMUL SRC SRC为乘数,被乘数隐含
指令功能:IMUL为有符号数乘法指令,其在用法上与MUL指令相同
跟MUL类似
除法类指令
DIV指令
指令格式:DIV SRC SRC为除数,被除数隐含
指令功能:DIV为无符号数乘法指令。当SRC为字节类型数据时,被除数默认为AX,商存于AL;当SRC为字类型数据时,被除数默认为AX,乘积存于DX:AX(即乘积的高16位存于AX,低16位存于DX)
例:
DIV BL;(AX)÷(BL) 商存于AL,余数存于AH
DIV CX;(DX:AX)÷(CX) 商存于AX,余数存于DX
注意:
- SRC不能是立即数或段寄存器
- SRC必须有明确的数据类型
- 当商超出了表示范围会发生除法溢出
IDIV指令
指令格式:IDIV SRC; SRC为除数,被除数隐含
指令功能:IDIV为有符号数除法指令,其在用法上与DIV指令相同
注意:
- 对有符号数除法,余数的符号与被除数符号相同
- 其他与DIV相同
符号扩展指令
此类指令用于有符号数(补码)的位数扩展,以满足有符号数运算对数据位数的要求
CBW指令
指令格式:CBW; 隐含操作数为AL
指令功能:将AL中的有符号数扩展到AX中(即将8位有符号数扩展为16位)。该指令实际上是将AL的符号位扩展到AH中,故称”符号扩展“
CWD指令
指令格式:CWD; 隐含操作数为AX
指令功能:将AX中的有符号数扩展到DX:AX中(即将16位有符号数扩展为32位)。该指令实际上是将AX的符号位扩展到DX中,故称”符号扩展“