汇编学习笔记——汇编指令

目录

汇编指令

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中

  • 5
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值