算术:
DIV 除法指令
格式:div 除数
即: div reg
/ div 内存单元
被除数:在寄存器 AX /AX + DX 中。
除数为8位,被除数则为16位,AX存放;
除数为16位,被除数32位,AX+DX存放;
结果:除数为8位,AL存储商,AH存放余数;
除数为16位,AX存储商,DX存放余数
内存单元作为除数,你可以配合ax/dx/si/di 和 byte/word ptr 。
(所谓更灵活的内存定位方式)
mul
注意:两个相乘的位数大小要一样,都是8位/16位;
存放:
8位:一个默认放在AL中,另一个放在8位reg或内存字节单元中;
16位:一个默认AX中,另一个放在16位reg或内存字单元中。
结果:8位 在AX中;16位 高位默认在DX中,地位默认在AX中。
格式:
mul reg
mul 内存单元
dd和dup
dd:
一种数据定义类型(伪指令)。
db和dw分别对应字节和字,dd(define double word) 对应 双字型数据。
dup:
dup与dw、db、dd 这类 数据定义伪指令 配合。
用来进行数据的重复。
格式: 数据类型 重复次数 dup (要重复的该类型数据)
例 :db 3 dub ('abc','ABC')
定义了18个字节。
shl和shr指令
shl :逻辑左移指令
1.将一个寄存器或内存单元中的数据向左移位;
2.将最后移出的一位写入CF中;
3.最低位用0补充
shr :逻辑右移指令
1.将一个寄存器或内存单元中的数据向右移位;
2.将最后移出的一位写入CF中;
3.最高位用0补充
转移:
转移指令:能够修改 IP/CS和IP 的指令。
即可以 控制cpu执行内存某处代码 的指令
转移指令分类:
- 无条件转移
- 条件转移
- 循环指令
- 过程
- 中断
1、段内转移:只修改IP;
短转移:ip修改范围:-128~127 ,格式:jmp short 标号
近转移:ip修改范围:-32768~32767,格式:jmp near ptr 标号
2、段间转移(远转移):同时修改CS、IP
3、无条件转移:jmp
4、条件转移:jcxz;所有条件转移都是短转移。
5、循环:loop;属于短转移
—>参考
offset
应用:取得标号的偏移地址
eg:
start:mov ax,offset start ;相当于 mov ax ,0
jmp类
jmp指令要给出两种信息:
- 转移的目的地址
- 转移的距离(位移):段间转移、段内短转移、段内近转移
这两种信息的侧重会区分不同的jmp类型指令。
- 位移型
jmp short
标号: IP = IP + 位移 (8位)
1.位移:标号地址 - jmp指令后第一个字节的地址 ,由编译程序算出
2.short 指明位移为8位
3.范围:-128~127 (补码)
jmp near ptr
标号:IP = IP + 位移(16位)
实现逻辑同上。
注意:
- CPU在执行位移型jmp指令的时候不需要目的地址,而是以偏移量(位移)的数据存储在底层内存。
- 位移型转移方便程序段在内存中的浮动装配。(目的地址存储太死板)
-
jcxz(条件转移)
所有条件转移指令是短转移。格式:
jcxz 标号
操作:IF(cx = 0),IP=IP+8位位移
ELSE 什么也不做 -
loop(循环指令)
所有的循环指令都是短转移
cx=cx-1;
if(cx!=0) IP = IP+8
-
目的地址在指令中的jmp
jmp far ptr 标号 : CS = 标号段地址 ; IP = 标号偏移地址
实现的是 段间转移、远转移,同时修改 CS IP。(存储形式为 段地址和偏移地址)
-
目的地址在寄存器的jmp
指令格式:jmp reg(16位)
功能:IP = reg(16位)
-
目的地址在内存的jmp
jmp word ptr 内存单元地址 (段内转移)
jmp dword ptr 内存单元地址(段间转移)
高地址 = 段地址 低地址 = 偏移地址
CS = IP+2
CALL和RET类
哥俩作为转移指令,经常共同用来实现子程序的设计。
call
两步操作:
- 将当前IP/ CS+IP 压入栈中
- 转移
这里同jmp指令一样,要根据转移方式区分为:
位移转移、目的地址在指令中、目的地址在寄存器中、地址在内存中
PS:CALL指令不能实现短转移,其实现转移的方法和jmp指令相同。
-
位移转移
格式:call 标号
作用:push ip
jmp near ptr 标号
(16位位移:标号地址 - call指令后第一个字节地址) -
目的地址在指令中
格式:call far ptr 标号
(短剑转移 )
作用:
push CS
push IP
jmp far ptr 标号
-
目的地址在寄存器中
格式:call 16位 reg
作用:
push IP
jmp reg(16)
-
目的地址在内存中
call word ptr 内存单元地址
作用:
push IP
jmp word ptr 内存单元地址
call dword ptr 内存单元地址
作用:
push CS
push IP jmp dword ptr 内存单元地址
ret和retf
ret操作:
POP IP
retf操作:
POP IP
POP CS
call 和 ret 实现子程序
格式:
标号:
指令
ret
main: call 标号
参数和结果传递:借助寄存器。
调用者将参数送入参数寄存器,从结果寄存器中取到返回值;
子程序从参数寄存器读取参数,将返回值送入结果寄存器。
1.如果参数过多,可以将批量参数放到内存,将他们所在内存空间的首地址存入寄存器,继而传递给需要的子程序。
2.如果寄存器发生冲突(如cx重复需要),可以进行不断备份,保存状态。