控制转移类指令

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

控制转移类指令

✧用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令.

✧控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变

说明

✧只有中断返回指令(IRET)改变控制标志位

✧许多转移指令受状态标志位的影响

1.无条件转移指令(JMP 操作数;程序转向label标号指定的地址)

◆寻址方式:

直接寻址方式

转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式

间接寻址方式

转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式

◆目标地址范围

✓段内(注意转移范围是+ -,即前后都可以转移!当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负)

✡段内转移——近转移(near)

⏹转移范围用二个字节表达,在当前代码段64KB范围内转移(±32KB范围)

⏹不需要更改CS段地址,只要改变IP偏移地址,由16位带符号数给出。

✡段内转移——短转移(short)

⏹转移范围用一个字节表达,在当前代码段256B范围内转移(-128~+127范围),

只改变IP的值,由8位带符号数给出。

✓段间

段间转移——远转移(far)

从当前代码段跳转到另一个代码段,可以在1MB范围

需要更改CS段地址和IP偏移地址

目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址。段间间接转移指令中,目的地址存放在连续4个存储单元字节中,低字节两个单元的内容代替IP,高字节两个单元的内容代替CS。

注:实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、near ptr或far ptr强制.

✌思考:

如果转移超过16BIT,怎么办?

答:变成段间转移。

JMP 1234H 这个指令对否?JMP 12345678H呢?

2、条件转移指令(Jcclable;条件满足,发生转移:IP←IP+8位位移量;条件不满足,顺序执行)

注意:1.Jcc本身不是一条指令,它是条件转移指令的统称。

2.操作数label是采用短转移,条件转移只能是短转移。

3.8位位移量是相对于当前IP的,相对寻址方式。

4.Jcc指令为2个字节,条件不满足时的顺序执行,就是当前指令偏移指针IP加。

5.不影响标志,但要利用标。

16条指令分成4种情况:

⑴判断单个标志位状态

⑵比较无符号数高低

⑶比较有符号数大小

⑷判断计数器CX 为0

指令应用示例:

例1.计算|X -Y|(绝对值)

;X 和Y 为存放于X 单元和Y 单元的16位操作数

;结果存入result

movax,X

subax,Y

jnsno_neg neg ax ;neg 是求补指令

No_neg: movresult,ax

例2.设字符的ASCII 码在AL 寄存器中,在字符ASCII 码中为“1”的个数已为奇数时,则令其最高位为“0”;否则令最高位为“1”。

and al,7fh ;最高位置“0”,同时判断“1”的个数 jnp next

;个数已为奇数,则转向next

or al,80h ;否则,最高位置“1”

next: ...

例3.记录BX 中1的个数

方法一:xoral,al ;AL =0,CF =0

again: test bx,0ffffh ;等价于

cmp bx,0

jz next ; ZF=1,去next

shl bx,1

jnc again

inc al

jmp again

next: ... ;AL保存1的个数

方法二:xoral,al ;AL=0,CF=0

again: cmp bx,0

jz next

shl bx,1 ;也可使用shr bx,1 Array adc al,0

jmp again

next: ... ;AL保存1的个数

例4.无符号数比较高低

补充知识:

无符号数的大小用高(Above)低(Below)表示

利用CF确定高低、利用ZF标志确定相等(Equal)

两数的高低分成4种关系:

⑴低于(不高于等于):JB(JNAE)

⑵不低于(高于等于):JNB(JAE)

⑶低于等于(不高于):JBE(JNA)

⑷不低于等于(高于):JNBE(JA )

比较之前一定要做可以改变标志位的减法,才能通过标志位来确定两数的高低大小关系。

比较两数大小,并将较大的数保存在AX里。

cmpax,bx ;比较ax和bx

jnb next ;若ax≥bx,转移

xchgax,bx ;若ax<bx,交换

next: ...

例5.比较有符号数大小

有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)

两数的大小分成4种关系:

⑴小于(不大于等于):JL(JNGE)

⑵不小于(大于等于):JNL(JGE)

⑶小于等于(不大于):JLE(JNG)

⑷不小于等于(大于):JNLE(JG )

尝试将例4程序段改成有符号数比较大小。

答:即把JNB改成JNL.

3.循环指令(loop)

LOOP label ;CX←CX-1,

;CX≠0,循环到标号label, CX=0,顺序执行

LOOPZ label ;CX←CX-1,

相关文档
最新文档