导航

✨学习笔记——从零开始速通汇编(一):寄存器 | 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

指令功能:将操作数OPR1OPR2的内容互换

注意:

  • 数据类型一致
  • 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指令

指令格式:

  1. IN AL,PORT 直接寻址方式,PORT为端口地址
  2. IN AL,DX 间接寻址方式,DX的内容为端口地址
  3. IN AX,PORT 直接寻址方式,PORT为端口地址
  4. 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中,故称”符号扩展“