汇编语言笔记6

课本第9、第10章

转移指令的原理

可以修改IP,或同时修改CS和IP的指令统称转移指令。有以下几类:

  • 只修改IP时,称段内转移,如 jmp ax
  • 同时修改CS和IP,称段间转移。如 jmp 1000:0

段内转移又分为:短转移(-128——127)【CPU在执行短转移的时候只需知道位移,不需知道地址】、近转移(-32768——32767)

8086CPU的转移指令分为:

  • 无条件转移指令(jmp)
  • 条件转移指令
  • 循环指令
  • 过程
  • 中断

操作符offset

操作符offset用于获取标号处的偏移地址

1
2
codesg segment
s:mov ax,offset s ;相当于 mov ax,0

jmp指令

jmp指令为无条件转移指令,可以只修改IP,也可以同时修改CS和IP

1
2
3
4
5
6
7
jmp short ptr 标号 ;段内短转移
jmp near ptr 标号 ;段内近转移
jmp far ptr 标号 ;段间转移(远转移),用标号处的段地址和偏移地址修改CS和IP
jmp 16位置寄存器 ;利用寄存器中的值修改IP
jmp 段地址:偏移地址 ;利用给出的段地址和偏移地址修改CS和IP
jmp word ptr 内存单元地址 ;利用内存单元中的字型数据修改IP
jmp dword ptr 内存单元地址 ;利用内存单元中的字型数据修改CS和IP,IP存在低地址,CS存在高地址

jcxz指令

所有的条件转移指令都是短转移

jcxz 标号 :如果cx的值为0,则跳转到标号处执行

loop指令

所有的循环指令都是短转移,如果cx不等于0,则执行标号处

loop指令工作原理:

1
2
cx--
if(cx != 0) jmp short 标号处

CALL和RET指令

ret和retf

  • ret利用栈中的数据,修改IP的内容,实现近转移
  • retf利用栈中的数据,修改CS和IP的内容,实现远转移

ret指令:

1
2
IP = SS*16+SP
SP=SP+2

retf指令:

1
2
3
4
IP = SS*16+SP
SP = SP+2
CS = SS*16+SP
SP = SP+2

call指令

call 标号

执行call指令时,先将当前的IP**(call指令的下一行代码的偏移地址)**压栈,然后跳转到标号处执行。

1
2
3
SP = SP-2
SS*16+SP = IP
IP = IP+16位位移

call far ptr 标号:实现的是段间转移。

1
2
3
4
SP = SP-2
SS*16+SP = CS ;push CS
SP = SP-2
SS*16+SP = IP ;push IP
1
2
3
call word ptr 内存单元地址 ;用内存单元地址的数据修改IP
call dword ptr 内存单元地址 ;用内存单元地址的数据修改CS和IP
call 16位寄存器 ;用寄存器中的值修改IP

call和ret配合使用,可以实现子程序的编程

mul指令

mul,乘法指令:

  • 两个相乘的数,要么都是8位,要么都是16位
  • 如果两个数都是8位,那么一个默认放在AL中,另一个在8位寄存器或者内存字节单元中。结果存在AX中
  • 如果两个数都是16位,那么一个默认在AX中,另一个在16位寄存器或者内存字单元中。结果的高位在DX中,低位在AX中
1
2
mul 寄存器
mul 内存单元