目录
汇编指令
定义:有对应的机器码的指令,可以被编译为机器指令,最终被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中