汇编语言--微机CPU的指令系统(五)(转移指令)

(9)转移指令程序员

转移指令是汇编语言程序员常常使用的一组指令。在高级语言中,时常有“尽可能不要使用转移语句”的劝告,但若是在汇编语言的程序中也尽可能不用转移语句,那么该程序要么没法编写,要么没有多少功能,因此,在汇编语言中,不但要使用转移指令,并且还要灵活运用,由于指令系统中有大量的转移指令。编程

转移指令分无条件转移指令和有条件转移指令两大类。指针

1、无条件转移指令(Transfer Unconditionally)blog

无条件转移指令包括:JMP、子程序的调用和返回指令、中断的调用和返回指令等。ip

下面只介绍无条件转移指令JMP(Unconditional Jump)。ci

JMP指令的通常形式:get

JMP 标号/Reg/Memit

JMP指令是从程序当前执行的地方无条件转移到另外一个地方执行。这种转移能够是一个短(short)转移(偏移量在[-128, 127]范围内),近(near)转移(偏移量在[-32K, 32K]范围内)或远(far)转移(在不一样的代码段之间转移)。io

短和近转移是段内转移,JMP指令只把目标指令位置的偏移量赋值指令指针寄存器IP,从而实现转移功能。但远转移是段间转移,JMP指令不只会改变指令指针寄存器IP的值,并且还会改变代码段寄存器CS的值。变量

该转移指令的执行不影响任何标志位。

例如:

next1: …

JMP next1 ;向前转移,偏移量之差为负数

JMP next2 ;向后转移,偏移量之差为正数

next2: …

在目前流行的汇编系统中,当段内转移时,有些软件把该转移指令默认为近转移,从而使指令的偏移量用一个字来表示,因而生成3个字节的指令代码,但若是程序员本身清楚转移的幅度在一个短转移的范围以内,那么,可用前置short的办法来告诉汇编程序,让它产生2个字节的指令代码。

好比:若是程序员知道在上例中的标号next2离“JMP next2”指令的偏移量不会超过127,那么,可用下面的转移方式来省掉一个字节的指令代码。

next2: …

JMP short next2 ;生成2个字节的转移指令,从而节省一个字节

2、条件转移指令(Transfer Conditionally)

条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位来决定是否须要转移,这就为实现多功能程序提供了必要的手段。微机的指令系统提供了丰富的条件转移指令来知足各类不一样的转移须要,在编程序时,要对它们灵活运用。

条件转移指令又分三大类:基于无符号数的条件转移指令、基于有符号数的条件转移指令和基于特殊算术标志位的条件转移指令。

(a) 无符号数的条件转移指令(Jumps Based on Unsigned (Logic) Data)

clip_image002

(b) 有符号数的条件转移指令(Jumps Based on Signed (Arithmetic) Data)

clip_image004

(c) 特殊算术标志位的条件转移指令(Jumps Based on Special Arithmetic Tests)

clip_image006

例5.15 编写一程序段,它把寄存器AX-BX的绝对值存入BX中。

解:

SUB BX, AX

JNS next

NEG BX

next: …

例5.16 已知一个字节变量char,试编写一程序段,把其所存的大写字母变成小写字母。

解:

char DB 'F' ;变量说明

MOV AL, char

CMP AL, 'A'

JB next ;注意:字符是无符号数,不要使用指令JL

CMP AL, 'Z'

JA next

ADD char, 20H ;小写字母比大写字母的ASCII码大20H

next: …

若是不知道(或忘了)大小写字母ASCII码之间的关系,那么,可用数值表达式'a'-'A'、'b'-'B'、…、'z'-'Z'等来代替具体的数值20H。

例5.17 编写一段程序,完成下面计算公式,其中:变量X和Y都是字类型。

解:

X DW ? ;变量说明

Y DW ?

MOV AX, X

MOV BX, AX ;用BX来临时存放计算结果

CMP AX, 0

JLE setdata

CMP AX, 500

JG case3

ADD BX, 100D ;BX=X+100

JMP setdata

next: SUB BX, 50D ;BX=X-50

setdata: MOV Y, BX ;把计算结果赋给变量Y

例5.18 下面循环体的指令代码字节数超过128,试改写该循环。

MOV CX, COUNT ;给循环计数器赋初值(>0)

again: 循环体指令序列 ;循环体的首地址偏移量大于128

LOOP again

解:

MOV CX, COUNT

again: 循环体指令序列

DEC CX

JNZ again ;把LOOP指令改成条件转移指令

相关文章
相关标签/搜索