文章目录[隐藏]
在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是由CS, IP中的内容决定的,程序员可以通过改变CS,IP中的内容来控制CPU执行目标指令。
我们如何改变CS, IP的值呢?显然,8086CPU必须提供相应的指令。我们如何修改AX中的值?可以用mov指令,如mov ax,123将ax中的值设为123,显然,我们也可以用同样的方法设置其他寄存器的值,如mov bx,123 mov cx,123 , mov dx,123等。其实,8086CPU大部分寄存器的值,都可以用mov指令来改变,mov指令被称为传送指令
但是,mov指令不能用于设置CS. IP的值,原因很简单,因为8086CPU没有提供这样的功能。8086CPU为CS, IP提供了另外的指令来改变它们的值。能够改变CS, IP的内容的指令被统称为转移指令(我们以后会深入研究)。我们现在介绍一个最简单的可以修改CS, IP的指令:jmp指令
。
若想同时修改CS. IP的内容,可用形如‘`jmp段地址:偏移地址”的指令完成,如
jmp 2AE3:3,执行后:CS=2AE3H, IP=0003H, CPU将从2AE33 H处读取指令。 jmp 3:0B16,执行后:CS=0003H, IP=OB16H, CPU将从OOB46H处读取指令。
jmp 段地址:偏移地址
,指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP
若想仅修改1P的内容,可用形如‘imp某一合法寄存器”的指令完成,如
jmp ax,指令执行前:ax=1000H, CS=2000H, IP=0003H 指令执行后:ax=1000H, CS=2000H, IP=1000H jmp bx,指令执行前:hx=0B16H, CS=2000H, IP=0003H 指令执行后:bx=0B16H, CS=2000H, IP=0B16H
jmp某一合法寄存器指令的功能为:用寄存器中的值修改IP
jmp ax,在含义上好似:mov IP,ax
注意
我们在适当的时候,会用己知的汇编指令的语法来描述新学的汇编指令的功能。采用一种“用汇编解释汇编”的方法来使读者更好地理解汇编指令的功能,这样做有助于读者进行知识的相互融会。要强调的是,我们是用“已知的汇编指令的语法”进行描述,并不是用“已知的汇编指令”来描述,比如,我们用mov IP,ax来描述j mp ax,并不是说真有mov IP,ax这样的指令,而是用mov指令的语法来说明jmp指令的功能。我们可以用同样的方法描述
jmp 3:01B6的功能:
jmp 3:01B6在含义上好似
mov CS,3 movIP,O1 B6
问题2.3
内存中存放的机器码和对应的汇编指令情况如图2.27所示,设CPU初始状态:
CS=2000H IP=OOOOH
请写出指令执行序列。思考后看分析。
分析
CPU对图2.27中的指令的执行过程如下:
(1)当前CS=2000H IP=0000H,则CPU从内存2000H* 16+0=20000H 处读取指令,读入的指令是:B8 22 66(mov ax,6622H),读入后IP=IP+3=0003H;
(2)指令执行后,CS=2000H , IP=0003H,则CPU从内存2000H * 16+0003H=20003H 处读取指令,读入的指令是:EA 03 00 00 10omp 1000:0003),读入后
IP=IP+5=0008H:
(3)指令执行后,CS=1000H , IP=0003H,则CPU从内存1000H X 16+0003H= I 0003 H处读取指令,读入的指令是:B8 00 00(mov ax,0000),读入后IP=IP+3=0006H;
(4)指令执行后,CS=1000H , IP=0006H,则CPU从内存IOOOH X 16+0006H=10006H处读取指令,读入的指令是:8B D8(mov bx,ax),读入后I P=IP+2=0008H ;
(5)指令执行后,CS=1000H , IP=0008H,则CPU从内存IOOOH X 16+0008H=10008H处读取指令,读入的指令是:PP B3(jmp bx),读入后IP=IP+2=OOOAH ;
(6)指令执行后,CS=1000H, IP=0000H,CPU从内存10000H处读取指令……
经分析后,可知指令执行序列为:
(1) mov ax,6622H (2) jmp 1000:3 (3} mov ax,0000 (4) mov bx,ax (5) jmp bx (6) mov ax,0123H (7) 转到第3步执行