--------------------------------转移指令的原理---------------------
1.操作符:offset
2.jmp指令
3.依据位移进行转移的jmp指令
jmp short 标号
jmp near ptr 标号
4.转移的目的地址在指令中的jmp指令
jmp far ptr 标号
5.转移地址在寄存器中的jmp指令
jmp 16为reg
6.转移地址在内存中的jmp指令
jmp word ptr 内存单元地址(段内转移)
jmp dword ptr 内存单元地址(段间转移)
7.jcxz指令
8.loop指令
1.-----操作符offset--------------
assume cs:code
code segment
start:mov ax,offset start ;相当于mov ax,0
s:mov ax,offset s ;相当于mov ax,3
code ends
end start
------------------------------------------------------------------
assume cs:code ;添加两条指令,使该程序在运行中将s处的一条指令复制到s0处。
code segment
s:mov ax,bx
mov si,offset s
mov di,offset s0
mov ax,cs:[si] ;--1--
mov cs:[di],ax ;--2--
s0:nop
nop
code ends
end s
-------------------------------------------------------------------
jmp指令为无条件转移指令,可以只修改ip,也可同时修改cs和ip。
jmp指令要给出的两种信息:
1.转移的目的地址
2.转移的距离(段间转移,段内短转移,段内近转移)
下面的几节内容,以给出目的地址的不同方法为主线,讲解jmp指令的主要
应用格式和cpu执行转移指令的基本原理。
--------------------------------------------------------------------
111111111111111111111111111111111111111111111111111111111111111111111
---------------------依据位移进行转移的jmp指令---------------------
------jmp short 标号 ;(转到标号处执行指令)指令实现的是段内短转移,
对ip的修改范围是:-128~127 ,shor符号说明指令进行的是短转移,标号
指明了要转移的目的地,转移指令结束后,cs:ip应该指向标号处的指令。
--------------------------------------------------------------------
assume cs:code
code segment
start:mov ax,0
jmp short s
add ax,1
s:inc ax
code ends
end start
------------------------------------------------------------------------
注意:jmp short 标号 所对应的机器码为EB03,这个机器码中竟不包含转移的目的地址。
说明:cpu在执行jmp指令的时候并不需要转移的目的地址。cpu在执行EB03的时候是根据什么修改的ip
使其指向目标指令呢!?就是根据指令码中的03.
指令EB03并没有告诉cpu要转移的目的地址,可告诉了cpu要转移的位移。
”jmp short 标号“的功能是;(ip)=(ip)+8位位移
1.8为位移=标号处的地址-jmp指令后的第一个字节的地址
2.short指明了此处的位移为8为位移
3.8为位移的范围为:-128~127,用补码表示
4.8为位移由编译程序在编译时算出。
jmp near ptr 标号 ; 实现段内近转移、
”jmp near ptr 标号“的功能是;(ip)=(ip)+16位位移
1.16为位移=标号处的地址-jmp指令后的第一个字节的地址
2.near ptr 指明了此处的位移为16位
3.16为位移的范围为:-32768~32767 用补码表示
4.16为位移由编译程序在编译时算出。
-------------------转移的目的地址在指令中的jmp指令--------------------
前面讲的jmp指令,其对应的指令中并没有转移的目的地址,而是相对于当前ip的转移位移,
“jmp far ptr 标号”实现的是段间转移,也称为远转移。
功能如下:(cs)=标号所在段的段地址;(ip)=标号在段中的偏移地址。
assume cs:code
code segment
start:mov ax,0
mov bx,0
jmp far ptr s
db 256 dup (0)
s:add ax,1
inc ax
code ends
end start
-u
0BBD:0006 EA0B01BD0B JMP 0BBD:010B
注意:jmp far ptr s所对应的机器码:EA0B01BD0B,其中包含转移的目的地址。
“B01BD0B”是目的地址在指令中的存储顺序。
高地址的“BD0B"是转移的段地址:0BBDH。
低地址的”0BO1"是转移地址:010BH
-----------------------------------------------------------------------
---------转移地址在寄存器中的jmp指令---------------------------------
指令格式:jmp 16位reg
指令功能:(ip)=(6位reg)
;mov指令不能用于设置cs,ip的值。因为:8086cpu没有提供这样的功能。
1.若想同时修改cs,ip的内容。可用形如:jmp 段地址:偏移地址 的指令完成
指令的功能:用指令中给出的段地址修改cs,偏移地址修改ip。
jmp 2ae3:3 执行后:cs=2ae3h。ip=0003h,cpu将从2ae33h处读取指令。
此指令是在debug中使用的汇编指令,汇编编译器并不认识。如果在源程序中使用,编译时也会报错。
2.若想仅修改ip的内容,可用形如:jmp 某一合法的寄存器 的指令完成。
指令功能:用寄存器中的值修改ip。如:
jmp ax 指令执行前:ax=1000h,cs=2000h,ip=0003h
指令执行后:ax=1000h,cs=2000h,ip=1000h
-------------------------------------------------------------------------------------
-----------------------转移地址在内存中的jmp指令------------------------------------
转移地址在内存中的jmp指令有两种格式:
1.jmp word ptr 内存单元地址(段内转移)
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
(ip)=(内存单元地址)
2.jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,
低地址处的字是转移的目的偏移地址。
(cs)=(内存单元地址+2)
(ip)=(内存单元地址)
----------------------------有条件转移指令------jcxz指令-------------------------------
所以的有条件转移指令都是短转移。在对应的机器码中包含转移的位移,而不是目的地址,对ip的修改范围都为:-128~127 。
指令格式:jcxz 标号(如果(cx)=0,转移到标号处执行)
操作:当(cx)=0时,(ip)=(ip)+8位位移
当(cx)不等于零时,什么也不做(程序向下执行)
8位位移=标号处的地址-jcxz指令后的第一个字节的地址
8位位移的范围为:-128~127,用补码表示
8位位移有编译程序在编译时算出。
jcxz 标号 的功能相当于:
if((cx)==0)
jmp short 标号:
----------------------------------------------------------------------------------------
-----------------------loop指令---------------------------------------------------------
loop指令为循环指令,所以的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址,
对ip的修改范围都为:-128~127.
指令格式:loop 标号 ((cx)=(cx)-1,如果(cx)不等于零,转移到标号处执行。)
操作:1.(cx)=(cx)-1
2.如果(cx)不等于零,(ip)=(ip)+8为位移
如果(cx)=0,什么也不再(程序向下执行)
8位位移=标号处的地址-loop指令后的第一个字节的地址
8位位移的范围:-128~127,用补码表示
8为位移有编译程序在编译时算出。
---------------------------------------------------------------------------------------- |