Pentium的指令系统(5)——调用/转移/循环控制/中断指令

关于转移指令和调用指令的寻址

下面以转移指令为对象来分析各种转移地址的寻址方式
(1)段内直接转移方式
用这种方式时,指令中给出一个相对位移量,这样,专一地址为EIP的当前内容再加上一个8位、16位或32位的位移量。因为位移量是相对于EIP来计算的,所以段内直接转移寻址也称为相对寻址。
既可用在条件转移指令中,也可用在无条件转移指令中,同样也可在调用指令中。

(2)段内间接转移方式
有效地址总是在寄存器中或在内存单元中,而对内存单元则用前面所述的对数据的各种寻址方式进行访问
只适用于无条件转移指令。

(3)段间直接转移方式
指令中要给出转移地址的段码(段地址或段选择子)和偏移量。产生转移时,将段码装入CS中,将偏移量装入EIP。可提供一种使程序从一个代码段转移到另一个代码段的方法。
只适用于无条件转移指令。

(4)段间间接寻址方式
EIP和CS用内存中内容来装入。
只适用于无条件转移。

子程序调用和返回指令CALL/RET

Pentium指令系统中提供了子程序的4中调用指令
Pentium的指令系统(5)——调用/转移/循环控制/中断指令
作用:
1.段内直接调用,调用地址在指令中给出
2.段内间接调用,调用地址由EAX给出
3.段间直接调用,调用的段码和偏移量都在指令中给出
4.段间间接调用,调用地址在DI所指地址开始的4单元

无条件转移指令和条件转移指令JMP/J*(其中,*代表各种条件)

(1)无条件转移指令JMP
无条件转移指令可转到内存中任何程序段。转移地址可在指令中给出,也可在寄存器中给出,或在存储器中给出。
和调用指令类似,无条件转移指令也可有四种形式
Pentium的指令系统(5)——调用/转移/循环控制/中断指令
(2)条件转移指令J*
这类指令以某一个标志位的值或某个比较结果作为判断是否进行转移的依据,如果满足指令中所要求的的条件,则产生转移,否则往下执行排在条件转移指令后面的一条指令。
特点:
1.所有的条件转移指令都是相对转移形式的,即只能在以本指令所指的EIP或IP加上8位、16位或32位的位移量范围内转移。
2.条件转移指令中,有相当一部分指令是在比较完两个数的大小以后,根据比较结果决定是否转移,对于具体的二进制数,看作有符号数和无符号数结果不同。
无符号数:用高于或低于的概念来作为判断依据
有符号数:用大于或小于的概念来作为判断依据

根据两个数的比较结果来决定转移
Pentium的指令系统(5)——调用/转移/循环控制/中断指令
作用:
有符号
1.结果为0,转移
2.结果不为0,转移
3.大于,即不小于且不等于,转移
4.不大于,即小于等于,转移
5.小于,即不大于且不等于,转移
6.不小于,即大于或等于,转移
无符号
7.低于,即不高于且不等于,转移
8.不低于,即高于或等于,转移
9.高于,即不低于且不等于,转移
10.不高于,即低于或等于,转移

Pentium的指令系统(5)——调用/转移/循环控制/中断指令
作用:
1.符号标志SF为1,转移
2.符号标志SF不为1,转移
3.溢出标志OF为1,则转移
4.溢出标志OF为0,则转移
5.奇/偶标志PF为1,则转移
6.奇/偶标志PF为0,则转移

专门根据CX或ECX中的值来决定是否转移
Pentium的指令系统(5)——调用/转移/循环控制/中断指令
作用:
1.CX为0,则转移到LABLE处,否则执行下一条指令
2.ECX为0,则转移到ABC处,否则执行下一条指令

实现功能:在2000H开始的区域中,存放着14H个数据,要求找出其中最大的一个数,并存到2000H单元。
Pentium的指令系统(5)——调用/转移/循环控制/中断指令
作用:
1.BX指向2000H
2.将BX所指单元的1个字节放入AL中
3.将14H放入CX中
4.BX指向下一个数
5.比较AL和BX指向的数的大小
6.如果大于等于,转移到P2
7.小于的话将BX指向的数放入AL中
8.CX减1
9.如果CX不等于0的话,转移到P1
10.CX等于0时,BX重新指向2000H
11.AL中的数放到2000H

循环控制指令LOOP、LOOPZ/LOOPE和LOOPNZ/LOOPNE

(一)计数循环指令LOOP
执行LOOP指令时,先将ECX或CX的内容减1,再判断ECX或CX中是否为0,如不为0,则继续循环,如为0,则退出循环,执行下一条指令。
Pentium的指令系统(5)——调用/转移/循环控制/中断指令
作用:
1.设置循环次数
2.CX减1,如不为0,则循环

(二)相等则循环指令LOOPZ/LOOPE
LOOPZ/LOOPE是同一条指令的两个不同助记符。执行时,先将ECX(CX)减1,再判断是否为0,并判断ZF是否为1,如果ZF=0,或ECX(CX)为0,则退出循环,只有ZF=1,且ECX(CX)不为0的情况下才继续循环。
注意:ECX(CX)中的值为0时,并不会影响标志位ZF,这就是说,ZF是否为0,是由前面其他指令通常是比较指令的执行决定的。
程序功能:在40个元素构成的数组中寻找第一个非0元素
Pentium的指令系统(5)——调用/转移/循环控制/中断指令
作用:
1.将28H放入CX中
2.数组序号从0开始,第0个元素的地址先设为FFH
3.当前数组元素序号放在SI中
4.判断此元素是否为0
5.当ZF=1且CX≠0时再循环,即当前元素为0且为找完时,则再寻找
6.当找到一个非0元素时,转移到OKK
7.如未找到任何一个非0元素,则转显示程序DISPLAY1
8.如找到非0元素,则转显示程序DISPLAY2

(三)不等则循环指令LOOPNZ/LOOPNE
当执行LOOPNZ/LOOPNE指令时,先使ECX(CX)减1,再判断ECX是否为0,且判断ZF的值。如果ECX(CX)不为0且ZF=0,则继续循环。