提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、CS与IP功能
- tips:CS、IP复位值
- 二、修改CS与IP的指令
- 1. jmp指令
- 三、与转移地址有关的寻址方式
- 1、段内转移
- 1.1 段内直接寻址
- 1.2 段内间接寻址
- 2. 段间转移
- 2.1 段间直接寻址
- 2.2 段间间接寻址
一、CS与IP功能
CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。
CS为代码段寄存器,IP为指令指针寄存器
在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存Mx16+N单元开始,读取一条指令并执行。
即8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。
tips:CS、IP复位值
在8086CPU 加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令 执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。
二、修改CS与IP的指令
1. jmp指令
8086CPU为CS、IP提供了特殊的指令来改变它们的值。能够改变CS、IP的内容的指令被统称为转移指令。
若想同时修改CS、IP的内容,可用形如jmp 段地址:偏移地址
的指令完成。
eg:
jmp 2AE3:3
,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。
jmp 3:0B16
,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取指令。
jmp 段地址:偏移地址
指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP。- 若想仅修改IP的内容,可用形如“jmp 某一合法寄存器”的指令完成,如
jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H 指令执行后:ax=1000H,CS=2000H,IP=1000H - “jmp 某一合法寄存器”指令的功能为:用寄存器中的值修改IP。
jmp ax
在含义上好似:mov IP,ax
(当然这么写不合法)。
三、与转移地址有关的寻址方式
该类寻址方式用来确定转移指令及call指令的转向地址(=转向段地址X16+转向有效地址)
转向地址
是由各种寻址方式得到的转向有效地址和段地址相加而成的,有效地址存入IP寄存器中,段地址指定为CS段寄存器内容。
1、段内转移
段内转移是指程序在同一代码段内,仅改变IP寄存器的值,而不改变CS寄存器的值所发生的转移。段内转移又分为段内直接转移和段内间接转移。
1.1 段内直接寻址
转向的有效地址 = 当前(IP) + 位移量(8bit/16bit)
转向有效地址(不是转向地址)用相对于当前IP值的位移量来表示的,所以它是一种相对寻址方式。指令中的位移量是有效地址与当前IP值之差。
这种寻址方式适用于条件转移和无条件转移指令
-
无条件转移在位移量为8位时称为短转移(SHORT),位移量为16位时则称为近跳转(NEAR PRT),仅做标示
JMP SHORT QUEST
其中QUEST表示转移的符号地址,操作符SHORT表示是个8位带符号数,数的范围是80H ~ 7FH,即 -128 ~ +127。它只能相对于当前IP(转移指令的下一条指令的首地址)所指的位置作-128 ~ +127范围内跳转,所以称为短跳转,是一种相对寻址。JMP NEAR PTR PROGA
其中PROGA表示转移的符号地址,操作符NEAR PRT表示是个16位带符号数,数的范围是8000H ~ 7FFFH,即-32768 ~ +32767。它只能相对于当前IP所指的位置作-32768 ~ +32767范围内跳转,所以称为近跳转,是一种相对寻址。
1.2 段内间接寻址
转向的有效地址是一个寄存器或存储单元的内容。可用除立即数以外的任何一种数据寻址方式得到,所得到的转向的有效地址取代IP寄存器的内容。
-
形如:
JMP BX
、JMP WORD PTR [BP+TABLE]
,WORD表示取该位置内容的一个字(两个字节)来作为IP内容- 已知 TABLE=20A1H ,(BX)=1256H ,(SI)=528FH,(DS)=2000H ,(232F7H)= 3280H ,(264E5H)=2450H。
JMP BX
——>(IP)=1256H
JMP WORD PTR TABLE[BX]
——> 跳转到的物理地址为DS<<1+(BX+TABLE) =232F7H,该地址存储内容为3280H,故此时(IP)=3280H
JMP WORD PTR [BX][SI]
——>(IP)=2450H(同理)
- 已知 TABLE=20A1H ,(BX)=1256H ,(SI)=528FH,(DS)=2000H ,(232F7H)= 3280H ,(264E5H)=2450H。
2. 段间转移
当程序在不同段间转移时,不仅要改变IP寄存器的值,同时也要改变CS寄存器的值,这种转移称为段间转移。段间转移又分为段间直接转移和段间间接转移。
2.1 段间直接寻址
用指令中提供的转向段地址和偏移地址取代CS和IP
形如 jmp far ptr next
- far表示转移距离大于±32K,或是不同段之间转移
- next表示自身在另一段程序里面的偏移地址 ,IP寄存器存储此时next的偏移地址
- CS寄存器此时传入next所在的另一个程序的CS段地址
2.2 段间间接寻址
用存储器中的两个相继字的内容取代IP 和 CS,存储单元的地址可用存储器寻址方式得到。
- 如
JMP DWORD PTR [TABLE+BX]
与段内间接寻址类似,此处DWORD指读取双字(四个字节作为CS和IP的新地址)- 若DS=3000H,BX=1200H,TABLE=0020H,则存储单元的
PA=30000+0020+1200=31220H
,指令执行前,CS=0000H,IP=1000H,(31220H)=40H,(31221H)=01H,(31222H)=00H,(31223H)=10H。指令执行后,CS=1000H,IP=0140H,(31220H)=40H,(31221)=01H,(31222H)=00H,(31223)=10H。
- 若DS=3000H,BX=1200H,TABLE=0020H,则存储单元的