目录

汇编指令

nop指令

mov、add、sub指令

adc、sbb指令

and、or指令

移位指令

逻辑左/右移指令

循环左/右移指令

算术左/右移指令

带进位循环左/右移指令

inc指令

push、pop指令

pushf、popf指令

栈存储

栈原理

loop指令

word/byte ptr指令

div指令

mul指令

jmp指令

段内短转移

段内近转移

段间转移(远转移)

未定距离转移

条件转移指令

以CX寄存器为条件(jcxz)

以PSW寄存器为条件

cmp指令

cld、std、movsb、movsw指令

rep指令

call与ret指令

int与iret指令

in与out指令

指令操作规范

指令汇总

操作符汇总

书写规范

指向内容

任意常量


 

汇编指令

定义:有对应的机器码的指令,可以被编译为机器指令,最终被CPU执行。

 

nop指令

定义:用于占位的空指令,无任何效果,在指令书写处占用一个字节的内存空间

示例:nop指令在内存中的状态

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,nop指令的机器码为90h,占用一个字节

 

mov、add、sub指令

定义:mov A,B 将B中的数据移入A;add A,B 将A与B相加的结果存入A;sub A,B 将A与B相减的结果存入A

示例1:mov与add指令对应到高级编程语言中

汇编学习笔记——汇编指令-编程知识网

PS:汇编指令不区分大小写,即MOV等效与mov

示例2:使用高低8位寄存器的情况下的指令执行结果

汇编学习笔记——汇编指令-编程知识网

PS:最后一条指令中,C5H与93H相加的结果为158,但因为al寄存器只能存储8位数据,因此最高位1因为数据溢出而被舍弃(因使用的是al寄存器进行独立运算,故该进位不会进入ah寄存器中

示例3:mov指令操作段寄存器

汇编学习笔记——汇编指令-编程知识网

PS1:如上图,mov指令不能修改段寄存器的内容为固定值(mov ds 2000或mov cs,0001),但可通过使用通用寄存器进行中转来实现这一过程(mov ax,2000 mov ds,ax)

PS2:mov、add指令操作固定地址的值时需要使用对内存寻址(mov 2000:1000,ffff或mov 2000:1000,ax或mov ax,2000:1000都是不成立的),具体方式见汇编学习笔记——寻址与存储对内存寻址部分

示例4:mov/add指令操作指令指针寄存器及add操作段寄存器

汇编学习笔记——汇编指令-编程知识网

PS:如上图,mov与add指令都无法以任何形式操作指令指针寄存器ip,且add指令无法以任何形式操作段寄存器的值(sub指令的特性与add指令的特性相同)

 

adc、sbb指令

定义:adc A,B 将A与B相加的结果加上PSW寄存器中的CF位后存入A;sub A,B 将A与B相减的结果减去上PSW寄存器中的CF位后存入A(关于PSW寄存器及CF位相关,见汇编学习笔记——寄存器的标志寄存器PSW部分)

示例1:编程计算1EF0001000H+2010001EF0H,将结果存放于ax(高16位),bx(次高16位),cx(低16位)中

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,先将最低16位相加,若有进位,则会将CF位置为1,再用adc将次高16位相加时便会加上该进位,最后使用adc将最高16位相加同理。adc指令因其将CF位加入计算的设计,可用于超大数据的相加运算

示例2:编程计算003E1000H-00202000H,将结果存放于ax(高16位),bx(低16位)中

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,先将低16位相减,若有借位,则会将CF位置为1,再用sbb将高16位相减时便会减去该借位sbb指令因其将CF位加入计算的设计,可用于超大数据的相减运算

示例3:使用adc指令进行超大数据相加

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上图1第2至8行所示,可定义任意的超大数据,此处为结果验证方便,使用了简单的数据

PS2:如上图1第31至48行所示,超大数据的相加减从其最低16位开始,将两个变址寄存器设为两段数据最低16位的起始位置后,使用loop指令进行循环相加

PS3:如上图低43行与第47行所示,对di和si使用sub等会影响CF位的指令前应当先将PSW寄存器入栈,使用结束后出栈,因需要CF位保存上一个循环中adc指令的结果

 

and、or指令

定义:and A,B 将A、B进行与运算的结果存入A;or A,B 将A、B进行或运算的结果存入A

示例:使用DOSBox测试and、or指令

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上图1,使用(ax)=0011001100110011b与(bx)=1100110011001100b进行两种指令的测试

PS2:如上图2、3,两种指令执行的结果忠实的反映在ax寄存器中存储的值上。

 

移位指令

定义:对二进制数据进行左移、右移的指令,根据特性分为逻辑、循环、算术、进位几种,移动的同时对PSW寄存器中的CF位产生影响。格式:移位指令 OPR,CNT 对OPR进行CNT次移位

示例:移位指令命名规范

汇编学习笔记——汇编指令-编程知识网

PS:以上列出移位指令中各字母的含义,以降低记忆难度并加深理解

 

逻辑左/右移指令

定义:对数据进行逻辑左/右移,移动方向上的最高位进入CF,最低位补0。格式:SHL OPR,CNT 逻辑左移;SHR OPR,CNT 逻辑右移

示例1:逻辑移位图示

汇编学习笔记——汇编指令-编程知识网

示例2:逻辑移位测试

汇编学习笔记——汇编指令-编程知识网

PS1:如上图所示,左移一个数相当于令其*2,右移一个数相当于令其/2。以上1进行3次左移后成为8。

PS2:使用移位指令时,CNT的值为1时可直接使用立即数给出,否则必须使用cl寄存器存储

 

循环左/右移指令

定义:对数据进行循环左/右移,移动方向上的最高位进入CF的同时进入最低位。格式:ROL OPR,CNT 循环左移;ROR OPR,CNT 循环右移

示例:循环移位图示

汇编学习笔记——汇编指令-编程知识网

 

算术左/右移指令

定义:对数据进行逻辑左/右移,移动方向上的最高位进入CF,最低位补0;特殊的一点在于,对于算术右移指令,其最低位补的是符号位的数值。格式:SHL OPR,CNT 逻辑左移;SHR OPR,CNT 逻辑右移

示例1:算术移位图示

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,算术左移指令与逻辑左移相同,算术右移指令的移动方向上的最低位是其符号位,当符号位为1时补1符号位为0时补0

示例2:算术右移测试

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,ah中的初值为85h即10000101b,右移后为c2h即11000010b可以看出右移方向上的最低位确实补上了符号位的1,并且其右移方向上的最高位1进入了CF,使之由NC(0)变为CY(1)

 

带进位循环左/右移指令

定义:对数据进行循环左/右移,移动方向上的最高位进入CF的同时,CF中原本存储的数值进入最低位。格式:RCL OPR,CNT 带进位循环左移;RCR OPR,CNT 带进位循环右移

示例:带进位循环移位图示

汇编学习笔记——汇编指令-编程知识网

 

inc指令

定义:inc 寄存器(或[偏移地址]) 将给出的寄存器或偏移地址中存储的值加一

示例:使用DOSBox测试inc指令

汇编学习笔记——汇编指令-编程知识网

PS:如上所示,每执行一次inc ax,ax寄存器内的数据便加一

 

push、pop指令

定义:push A 将A中的数据送入栈中;pop A 将栈顶数据取出送入A中

示例1:8086CPU中的栈图示

汇编学习笔记——汇编指令-编程知识网

 

pushf、popf指令

定义:pushf 将PSW标志寄存器的值压栈;popf 将PSW标志寄存器的值出栈(关于PSW寄存器及CF位相关,见汇编学习笔记——寄存器的标志寄存器PSW部分)

 

栈存储

定义:栈在内存中的存储位置与栈大小是由栈段寄存器SS与栈顶指针寄存器SP共同决定的,SS中存放栈顶的段地址,而SP中存放栈顶的偏移地址(即栈的大小),而SS:SP地址则指向栈顶元素

示例1:当SS中存放1000,SP中存放0010时内存中的栈段示例

汇编学习笔记——汇编指令-编程知识网

PS:如上,此时SS:SP即1000C为栈顶

示例2:使用代码测试栈的使用

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:测试用代码如上图1所示,先定义栈段,后进行入栈和出栈操作

PS2:常规出入栈测试如上图2与3所示,ax与bx分别出入栈之后,他们的值交互了(当需要交换几个寄存器中的数据时,可参考该方案)。

PS3:虽然通过SS与SP规定了栈的大小,但实际上系统并不会对越界行为进行检测,如上图4所示,通过多进行两次pop操作,可以访问到栈外元素

PS4:如上图4所示,栈内的第一个单元(1000:0000)不存储数据,栈内每个元素占据一个字单元(字单元的概念见汇编学习笔记——寻址与存储)

 

栈原理

定义:push与pop指令的执行实际上是由mov、sub、add三种操作复合而成的

示例1:push指令机理

汇编学习笔记——汇编指令-编程知识网

示例2:pop指令机理

汇编学习笔记——汇编指令-编程知识网

PS:应当牢记,push操作会先使sp的值减小后将ax的内容入栈pop操作会先将ss:sp的值出栈入ax后使sp的值增大

 

loop指令

定义:loop A 先将cx寄存器中的数据减一,后判断cx的值是否为零,若为零则程序继续向下执行,否则程序跳转至标记为A处的代码继续执行。其中A称为loop标号,可为任意字符串

示例1:测试使用loop指令实现循环累加

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上图所示,将cx设为2后,loop指令将进行两次循环,将ax中的值自0累加至2

PS2:如上所示,自定义的loop标号在汇编程序完成编译后将被解析为标号处的地址(见上图2的最后一行,loop loopy被解析为loop 0006,而ip=0006正是loopy标号所在的inc ax代码行在内存中的偏移地址),因此loop实际上和jmp做了相似的行为,区别在于loop在执行前需要对cx中的值进行一次判断

PS3:对应到高级编程语言中,loop实际上类似于do…while循环语句,其循环体无论如何都会被执行至少一次

示例2:计算ffff:0006字节单元中的数乘以3,并将结果存储在dx中

汇编学习笔记——汇编指令-编程知识网

PS1:以上第三行中,将ffff移入ax时需要将之写为0ffff。因在汇编源程序中,数据不能以字母开头

PS2:以上第七行中,将ah置为0,是为了保证ax的值同al中的值相等

示例3:指令机器码辨析

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,loop s的机器码为E2FC,FC即-4,加上下一条指令的偏移地址000A后正好为s所在的add ax,ax的偏移地址0006

 

word/byte ptr指令

定义:在没有寄存器参与的内存单元访问指令中,可显性的指明所要访问的内存单元的长度。格式:word ptr 指明所要访问的内存为字单元;byte ptr 指明所要访问的内存单元为字节单元

示例:使用两种指令改变数据

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上图1所示,该指令是通过嵌入其他指令生效的

PS2:如上图2所示,使用byte ptr操作数据时,只改变了073f:0002一个字节的数据,而当使用word ptr操作数据时,改变了073f:0002与073f:0003连个字节即一个字单元的数据

 

div指令

定义:div A 以A为除数(A可以是寄存器或内存单元,不可以是立即数(常数))。若A为8位数据,则默认被除数保存与AX中,完成除法之后商存放在AL中,余数存放在AH中若A为16位数据,则默认被除数的低位保存于AX中,高位保存于DX中,完成除法后商存放在AX中,余数存放在DX中

示例1:8位除法示例

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上图2所示,在div bl导致(ax)/(bl),结果中的商为40,存入al,结果中的余数为08,存入ah

PS2:如上图3所示,在div bl导致(ax)/(bl),结果中的商为40,存入al,结果中的余数为00,存入ah

示例2:16位除法示例

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上图2所示,在div bx导致(dx)*10000H+(ax)除以bx,结果中的商为400,存入ax,结果中的余数为88,存入bx

PS2:因被除数必须存储于ax与dx中,故若进行除法时,ax与dx寄存器中已存储其他重要数据,则应将其暂时压栈或存入其他内存单元,完成除法后再复原

 

mul指令

定义:mul A 以A为乘数(A可以是寄存器或内存单元,不可以是立即数(常数))。若A为8位数据,则默认被乘数保存与Al中,完成乘法之后结果存放在AX中若A为16位数据,则默认被乘数保存于AX中,完成除法后结果的低位存放在AX中,高位保存于DX中

示例1:乘法规则

汇编学习笔记——汇编指令-编程知识网

PS:如上图,乘法的规则同除法相当类似

示例2:乘法示例

汇编学习笔记——汇编指令-编程知识网

PS:如上图,0100H与0100H相乘后成为00010000H,其中dx保存0001,ax保存0000

 

jmp指令

定义:无条件转移指令。格式:

jmp 段地址:偏移地址 用指令中给出的段地址修改CS寄存器,偏移地址修改IP寄存器(该用法无法被常规编译器中编译,利用debug直接操作内存时可用);

jmp 某一合法寄存器 用指令中给出的寄存器内存储的值修改IP寄存器;

jmp 地址标号 用地址标号所代表的内存地址的值修改IP寄存器(该用法只在面对编译器编程中可用)

示例1:使用jmp在两段存储与不同内存地址处的代码间跳转示意图

汇编学习笔记——汇编指令-编程知识网

PS:以上代码从2000:0000即20000开始执行,执行到jmp 1000:3时跳转至10003处的mov ax,0000,继续执行至jmp bx时跳转至10000处的mov ax,0123

示例2:在DOSBox内使用debug功能测试示例1中的代码

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:上图1中完整的将目标代码写入了对应内存区段

PS2:上图2为逐条执行代码的结果,可以看到程序执行符合预期,第一次jmp指令同时改变了cs和ip内的值,第二次jmp指令只改变了ip内的值

PS3:虽然mov指令同样可以间接的操作段寄存器,但是因其无法以任何形式操作指令指针寄存器,故当需要对代码段寄存器CS与指令指针寄存器IP进行操作时,优先使用jmp指令

 

段内短转移

定义:只改变ip寄存器值的跳转方式,且一次修改的数据最大为一个字节(IP的修改范围为-128~127)。格式:jmp short 地址标号

示例:短转移机器码辨析

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,jmp short s的机器码为EB03,意为将ip寄存器的值加上03。当执行完076a:0003处的指令时,ip寄存器内的值为0005,加上03为0008正好指向s标号所处的inc ax的内存地址076a:0008处。由此可得,jmp short的机器指令原理是跳转到指令的相对位置而非绝对位置

 

段内近转移

定义:只改变ip寄存器值的跳转方式,且一次修改的数据最大为一个字(IP的修改范围为-32768~32767)。格式:jmp near ptr 地址标号

示例:近转移机器码辨析

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,jmp near ptr s的机器码为E90001,意为将ip寄存器的值加上0100(内存存储的数据高位在后,低位在前)。当执行完076a:0006处的指令时,ip寄存器内的值为0009,加上0100为0109正好指向s标号所处的add ax,1的内存地址076a:0109处(db 256 dup(0)占用256个字节即0100h个字节)。由此可得,jmp near ptr的机器指令原理是跳转到指令的相对位置而非绝对位置

 

段间转移(远转移)

定义:同时改变cs和ip寄存器值的跳转方式,一次跳转的长度没有限制。格式:jmp far ptr 地址标号

示例:远转移机器码辨析

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:如上图2所示,jmp far ptr s的机器码为EA0B016A07,转译之后为076a010b(内存存储的数据高位在后,低位在前),意为将cs寄存器的值置为076a,将ip寄存器的值置为010b。如上图1,3所示,s标号所处的add ax,1的内存地址确为076a:010b。由此可得,jmp far ptr的机器指令原理是跳转到指令的绝对位置而非相对位置

 

未定距离转移

定义:当使用类似jmp 寄存器或jmp 内存地址 时,转移的长度由寄存器的大小/内存的大小决定

示例1:使用寄存器时的jmp

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,jmp bx的机器码为ffe3,并未出现固定的数值,具体转移位置由指令执行时BX内的数值决定

示例2:使用内存单元时的jmp

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,使用内存单元时必须显性的标明内存单元的大小,根据内存单元的大小,指令会以不同的方式执行

 

条件转移指令

定义:根据某种条件为判据,判断为真则进行跳转,判断为假则不跳转

 

以CX寄存器为条件(jcxz)

定义:当cx寄存器中的值为0时进行跳转,否则不跳转,且一次修改的数据最大为一个字节(IP的修改范围为-128~127)。格式:jcxz 地址标号

示例1:当超出最大IP修改范围,编译器报错

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,jcxz无法修改超过一个字节的ip范围,且不支持near ptr/far ptr等修正,此处与jmp区分

示例2:指令机器码辨析

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,jcxz ok的机器码为e304,正好为ok所在的mov dx,bx的偏移地址0010减去jcxz下一条指令的偏移地址000c

 

以PSW寄存器为条件

定义:根据PSW中各标志位的状态进行条件判断,判断结果为真则跳转

示例:跳转指令表格

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:以上跳转指令多同cmp指令协同使用,其中图4为以上指令中的各字母的释义,可帮助理解与记忆

 

cmp指令

定义:cmp A,B 计算A-B并根据计算结果改变PSW寄存器中的各标志位,但不会将A-B的值存储到任何位置,也不会影响A、B的值

示例1:当AX、BX中存储无符号数时,执行完cmp ax,bx后PSW的状态代表的信息

汇编学习笔记——汇编指令-编程知识网

PS:如上所示,cmp作为一种比较指令,可用于比较各数值间的关系,实质上将cmp换位sub指令以上表格也成立,但cmp指令因其不对ax和bx的值产生影响而更为合适

示例2:当AX、BX中存储有符号数时,执行完cmp ax,bx后PSW的状态代表的信息

 

汇编学习笔记——汇编指令-编程知识网

PS:同无符号数的比较相似,但因符号位的存在而有所差别

示例3:cmp与条件转移指令配合实现if结构

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上所示,通过配合使用两种指令,图1的汇编代码可达成图2的c代码的效果

PS2:若把je换成ja/jg,则if条件变为a>b;若jb,则if条件变成a<b。灵活变动、嵌套条件转移语句与比较语句,便能达成多种结构。

 

cld、std、movsb、movsw指令

定义:cld 将标志寄存器PSW的DF位设为0(clear);

std 将标志寄存器PSW的DF位设为1(setup);

movsb 以字节为单位将ds:[si]处的数据复制至es:[di]并根据DF位的值改变si和di的值;

movsw 以字为单位将ds:[si]处的数据复制至es:[di]并根据DF位的值改变si和di的值

示例1:串处理指令movsb与movsw与DF的关系

汇编学习笔记——汇编指令-编程知识网

PS:根据需求定义好si与di的初值并使用cld/std设置好DF位的值后,即可使用movsb/movsw快速进行数据复制

示例2:使用串处理指令传输数据

汇编学习笔记——汇编指令-编程知识网

PS:如上图所示,通过使用movsb指令,可以简洁快速的完成数据的复制操作

 

rep指令

定义:根据cx的值,重复执行其修饰的指令,重复次数即cx中的值。格式: rep 某指令

示例:使用rep实现高效复制数据

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:rep指令可以看做简化的loop指令,当需要重复执行的指令只有一条时,用rep代替可提高代码可读性,使之更为简洁。

 

call与ret指令

定义:call子程序调用指令,调用时跳转,完成调用后使用ret/retf指令可返回调用处的下一条指令继续执行。格式:call 标号 将ip压栈,并跳转至标号处;call far ptr 标号 将cs压栈将ip压栈,并跳转至标号处。

ret 子程序返回指令,调用时跳转。格式:ret 将ip出栈;retf 将ip出栈将cs出栈;ret/retf idata 将ip/ip与cs出栈后再将sp的值加上idata

示例1:call指令的实质

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上图,call 标号;相当于push ip与jmp near ptr 标号;的结合,当调用call时,ip切实被压入栈内了。其机器码也如同jmp,是相对地址跳转

PS2:如上图,ret相当于pop ip,当调用ret时,ip切实被出栈的数据取代了。

PS3:实质上,call 也可和jmp一样,可与寄存器、内存单元一同使用。其原理机制也和jmp完全相同(进行反汇编时,此类形式最为常见),故此处不再赘述。call与jmp唯一的区别在于call没有短转移,且call多了一步压栈。

示例2:ret与retf的机理

汇编学习笔记——汇编指令-编程知识网

PS1:如上图所示,ret和retf并不依赖于call,可以手动压栈任意希望跳转的地址后直接调用,因其实质为pop操作

PS2:当使用call和ret指令的时候一定会使用到栈,因此在程序中一定要预先定义好栈结构,否则程序会调用未知的内存空间作为栈,这极不稳定,可能导致程序错误

PS3:若在使用call进入子程序时同时使用了栈作为参数传递的媒介,在结束时应该使用ret idata来清除栈中的参数(ret idata 相当于 pop ip后add sp,idata。若栈中有两个参数,分别占用2个字节,则使用ret 4即可使sp跳过两个参数,达到清除栈中无用参数的目的

 

int与iret指令

定义:int n 引发中断类型码为n的中断;iret 在中断程序中使用,返回引发中断的程序。

示例1:编写程序时引发中断

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上图1,为编写汇编程序时必写的代码,其实质上是引发DOS提供的中断类型码为21h的中断,并调用中断程序中的4c(存放在ah中)号子程序,将0(存放在al中)作为返回值提交给系统的同时将CPU交还给系统。

PS2:如上图2,在执行程序时,可用int引发任意中断,可以是系统提供的,也可以是自定义的。

PS3:类似高级编程语言,汇编同样可以调用大量已编写完成的程序来完成功能。这些程序通常由BIOS和DOS系统以中断的形式提供,当需要使用时便可用int指令进行调用

示例2:编写并调用功能性中断程序

汇编学习笔记——汇编指令-编程知识网

PS1:如上图所示,编写一个中断类型码为7ch的中断程序并将之存入0:200h开头的内存单元中,将中断程序的起始地址写入中断向量表(IAT)中中断类型码对应的区域。

PS2:如上图所示,执行int指令时类似call指令,执行iret指令时类似retf指令,区别在于作为中断调用多了为标志寄存器的入栈和出栈操作(因为进入中断程序必然改变TF和IF的值,故需要先保存PSW)。在中断程序执行一次乘法操作之后,使用iret返回原程序继续执行,同call指令产生的效果相似。

 

in与out指令

定义:用于读写端口以此操作外部设备的指令。格式:in al/ax,idata/dx 将idata或dx代表的端口中的数据读入al/ax中;out idata/dx,al/ax 将al/ax中存储的数据写入idata或dx代表的端口

示例:通过读写端口令扬声器发声

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS1:如上所示,以上代码编译链接之后执行效果为扬声器发出一声哔’。更多端口操作示例见汇编学习笔记——外部设备,端口相关知识见汇编学习笔记——寻址与存储的端口部分

PS2:当操作的端口在0~255范围内时,端口号可用立即数给出;当操作的端口在256~65535范围内时,端口号必须放在dx中。in/out指令使用的寄存器都是固定的,al/ax/dx不可替换,访问8位端口时用al,访问16位端口时用ax

 

指令操作规范

定义:各种指令有其对应的使用规范,以下列出部分

示例:mov/add/sub的使用规范

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:以上只列出部分,更多使用规范可自行测试探索

 

指令汇总

定义:除以上提到的指令之外,仍有大量汇编指令是不那么常用,但于某些状况下十分便利的。

示例1:数组传送类指令汇总

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:LAHF/SAHF/PUSHF/POPF/CBW与CWD是无操作数指令

示例2:算术指令汇总

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:如上图4、上图2所示,计算机中常用BCD码保存十进制数,但这样保存的数进行运算时,应用的是2进制-16进制运算规则而非十进制运算规则,导致其运算结果出现偏差。使用如上图3所示的BCD码调整指令即可修正错误的运算。

示例3:逻辑指令汇总

汇编学习笔记——汇编指令-编程知识网

PS:以上逻辑指令已于文章前部全数分析完毕,此处不做赘述

示例4:串处理指令汇总

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:如上图3所示,使用scasb(scan string by byte)配合repne(repeat when not equal)实现循环查找一个字符串中的字节型数据。其中al中保存目标字节,cx中保存最大循环次数。当执行完毕时cx不为小于零的数,则代表查找成功(有些程序会利用该手法在自身代码中查找机器码CC(对应指令int 3,调试器使用该指令实现软件断点)来进行反调试)

示例5:控制转移指令汇总

汇编学习笔记——汇编指令-编程知识网

PS:以上控制转移指令已于文章前部全数分析完毕,此处不做赘述

示例6:处理机控制与杂项操作指令

汇编学习笔记——汇编指令-编程知识网

PS:至此,所有汇编指令汇总完毕,若对某个特殊指令有使用的需求,请搜索查找对应的详细信息学习。

 

操作符汇总

定义:除各类汇编指令外,同指令一同使用的操作符也相当常见,将各类元素组合为表示式的操作符是十分必要且便利的。

示例1:算术操作符汇总

汇编学习笔记——汇编指令-编程知识网

PS:以上为最常见常用的算术操作符,无需赘述

示例2:逻辑和移位操作符汇总

汇编学习笔记——汇编指令-编程知识网

PS:以上逻辑与移位操作符实际上同逻辑与移位指令,当将之用于组合元素为表达式时,视为操作符

示例3:关系操作符汇总

汇编学习笔记——汇编指令-编程知识网

PS:类比jmp指令的各类条件跳转衍生指令,以上关系操作符对两个元素进行关系运算,将运算结果作为表达式的值给出(如LE代表比较操作符两边的元素是否相等)。

示例4:数值回送操作符汇总

汇编学习笔记——汇编指令-编程知识网

汇编学习笔记——汇编指令-编程知识网

PS:如上图1所示,offset操作符已于文章上部进行过解析;type操作符检测操作数的数据类型,并将其数据类型以数字的形式给出(db字节型则为1,dw字型则为2);length操作符检测操作数是否为dup定义的数组,若是则给出数组的大小;size操作符相当于length与type的联合,给出操作数占用的空间大小。如上图2为各操作符的使用示例

示例5:属性操作符汇总

汇编学习笔记——汇编指令-编程知识网

PS:如上图,ptr、段操作符、short操作符已于文章上部解析;this操作符类似伪指令中的label指令,用于指定操作数的数据类型;high操作符取操作数的高位作为结果值,low操作符取操作数的低位作为结果值。

 

书写规范

定义:实际编程中不使用的,纯粹用于书面描述的一些规范

 

指向内容

定义:当书写汇编代码时,若需要表示一个内存单元内或寄存器内的内容,应当将之用小括号围起。格式:(内存单元或寄存器)

示例:几种汇编代码的描述方法

对于add ax,2;将之描述为(ax)=(ax)+2

对于mov [2],ax;将之描述为((ds)*16+2)=(ax)

PS:在实际编程中,并不使用小括号,此种描述方式只用于书面表达

 

任意常量

定义:当书写汇编代码时,若需要表示一个任意值的常量,可用idata表示,将此类出现在代码中并直接给出具体数值的数称为‘立即数’。

示例:几种书写方式代表的汇编代码

mov ax,[idata];代表mov ax,[1]、mov ax,[2]、、、、

mov bx,idata;代表mov bx,1、mov bx,2、、、、

PS:在实际编程中,并不使用idata,此种描述方式只用于书面表达