1、3 . 8086的寻址方式和指令系统,3.1 16位微处理器的寻址方式3.2 IBM-PC机的指令系统,微第3章,本章学习要求,1、掌握16位微处理器的寻址方式,3、了解32位微处理器的指令系统 *,2、掌握16位微处理器的指令系统,预备知识:,1、计算机是通过执行指令序列来工作的。,2、指令是由操作码和操作数组成的。,例:MOV AX,2000H,操作码:指示计算机所要执行的操作。,操作数:指出指令(操作码)在执行过程中所需的信息(数据或数据所在的地址)。不同指令所需要的操作数个数不同。,例:ADD CL,BH,ADD:操作码,指令要计算机执行加法操作。,CL、BH:操作数,是执行该操作所需
2、要的信息。,汇编指令一般格式:,3、计算机只识别二进制代码,所以机器指令(代码)是由二进制代码组成的。为便于记忆,用助记符(如汇编语言)来表示。汇编语言(包括其他高级语言)与机器语言是一一对应的。,汇编指令包括单操作数指令和多操作数指令,大多数汇编指令是双操作数指令。,3.1 寻址方式,寻找数据或数据所在地址的方式称为寻址方式。,与数据有关的寻址方式与转移地址有关的寻址方式,寻址方式包括有两大类:,与数据有关的寻址方式:以 MOV 指令为例 立即寻址 MOV AX , 3069H 寄存器寻址 MOV AL , BH 直接寻址 MOV AX , 2000H 寄存器间接寻址 MOV AX , BX
3、 寄存器相对寻址 MOV AX , COUNT SI 基址变址寻址 MOV AX , BP DI 相对基址变址寻址 MOV AX , MASK BX SI ,存储器寻址,(1) 立即寻址方式 数据在指令中给出指令格式: MOV AL, 5MOV AX, 3064HMOV AL, A * 只能用于SRC字段(源操作数字段): MOV 40H, AL * SRC 和 DST 的字长必须一致 MOV AH, 3064H ,(2) 寄存器寻址方式 数据在指定的寄存器中例: MOV AX, BXMOV AL, BHMOV AL, BL * 字节寄存器只有 AH AL BH BL CH CL DH DL
4、* SRC 和 DST 的字长必须一致: MOV AH, BX * CS 不能用 MOV 指令改变 MOV CS, AX ,(AX) = 3064H(BX) = 1234H MOV AX,BXMOV AL,BH,12 34,执行后 AX BX,12 34,执行后 AL BH,1 2,1 2,例:,此时寄存器AX中的值是多少?,(3) 直接寻址方式 指令给出了数据所在的存储单元的段偏移地址(有效地址EA),MOV AX,2000H 偏移地址:2000H 段地址:(隐含DS) 假设(DS)=3000H2000H+ 30000H 物理地址:32000H 结果:(AX)=3050H,OP,AX,50,
5、00,30,32000H,数 据 段,代码 段,例:,30,50,* 隐含的段为数据段 DS * 可使用段跨越前缀 MOV AX, ES: 2000H,注意:,(4) 寄存器间接寻址 存储单元的段偏移地址在基址寄存器(BX/BP)或变址寄存器(SI/DI) 中例:MOV AX, BX MOV AX, ES:BX MOV AX, BP,存放段基地址的段寄存器有如下三种可能:,若以SI/DI/BX间接寻址,则段基地址在数据段寄存器DS中;,若以寄存器BP间接寻址,则段基地址在堆栈段寄存器SS中;,若指令中规定是段超越的,也可以寻访其他段。,例:MOV AX,SI ,1000H,20000H,SI,
6、+ DS,物理地址:21000H,21 43,21000H,AX,21,43,若以SI/DI/BX间接寻址,则段基地址在数据段寄存器DS中;,若以寄存器BP间接寻址,则段基地址在堆栈段寄存器SS中;,例:MOV AX,BP,3000H,19000H,BP,+ SS,物理地址:1C000H,1C000H,AX,20 4B,20,4B,若指令中规定是段超越的,也可以寻访其他段。,例:MOV AX, ES:BX MOV AX, ES:BP,(5) 寄存器相对寻址(直接变址寻址) 段偏移地址由指定的寄存器内容和指令中给定的8位或16位偏移量相加得到。例:MOV AX, COUNTSI MOV AX,
7、COUNT+SI ;其中COUNT为16位位移量的符号地址,段寄存器的选择与寄存器间接寻址方式一样,有三种可能。,例:MOV AX,COUNTSI,2000H,30000H,SI,COUNT,35000H,count,(AX)=4525H,+DS,45 25,45,25,3000H,AX,00,30,OP,(6) 基址变址寻址 段偏移地址是由一个基址寄存器(BX/BP)和一个变址寄存器(SI/DI)的内容相加得到。例:MOV AX, BXDI MOV AX, BPDI,若使用的基址寄存器是BX,则默认段寄存器为DS;,若使用的基址寄存器是BP,则默认段寄存器为SS;,同样可以使用段超越,如:,
8、MOV AX,ES:BXSI,0158H,10A5H,BX,+ DS,221FDH,DI,21000H,AX,21,45,21 45,MOV AX,BXDI若(DS) = 2100H;(BX) = 0158H;(DI)=10A5H,例:,(7) 相对基址变址寻址 段偏移地址是由一个基址寄存器(BX/BP)、一个变址寄存器(SI/DI)的内容和一个8位/16位位移量相加得到。即:,=,(BX) (SI) 8位 (BP) (DI) 16位,+,+,位移量,偏移地址/,有效地址,格式:,MOV AX, MASK BX SI 或 MOV AX, MASK BX+SI 或 MOV AX, MASK+BX
9、+SI,例:MOV AX,MASKBXSI,1000H,2000H,SI,BX,33250H,33 44,33,44,AX,30000H,MASK,DS,0250H,(8) 比例变址寻址,(9) 基址比例变址寻址,(10) 相对基址比例变址寻址,32位,略,访问存储器的方式,默认的 段寄存器,可跨越的 段寄存器,偏移地址,取指令 CS 无 IP 堆栈操作 SS 无 SP 一般数据访问 DS CS ES SS 有效地址EA BP作为基址的寻址 SS CS DS ES BP 串操作的源操作数 DS CS ES SS SI 串操作的目的操作数 ES 无 DI,段 寄 存 器 的 使 用 规 定,3.
10、2 8086的指令系统,指令系统可以分为6组,数据传送指令,逻辑指令,控制转移,处理机控制,串操作,算术指令,对于指令系统的学习,重点关注: 指令的汇编格式 指令的基本功能 指令支持的寻址方式 指令的执行对标志位的影响 指令的特殊要求,一、数据传送指令,1、通用数据传送指令:MOV; PUSH; POP; XCHG,3、地址传送指令:LEA ; LDS; LES,4、标志寄存器传送指令:LAHF; SAHF; PUSHF; POPF(标志入AH) (AH入标志) (标志入栈) (标志出栈 ),2、累加器专用传送指令:IN; OUT; XLAT这组指令只限于累加器AX,AL。,5、类型转换指令:
11、CBW; CWD,传送指令: MOV DST, SRC执行操作: (DST) (SRC)注意: * DST、SRC 不能同时为段寄存器 MOV DS, ES * 立即数不能直接送段寄存器 MOV DS, 2000H * DST 不能是立即数和CS* DST、SRC 不能同时为存储器寻址* 不影响标志位,1、通用数据传送指令,进栈指令: PUSH SRC执行操作: (SP) (SP) 2 ( (SP)+1, (SP) ) (SRC)出栈指令: POP DST执行操作: (DST) ( (SP)+1, (SP) ) (SP) (SP) + 2堆栈:先进后出的存储区,段地址存放在SS中,SP在任何时
12、候都指向栈顶,进出栈后自动修改SP。注意: * 堆栈操作必须以字为单位。 * 不影响标志位* 出栈指令不能用立即寻址方式 POP 1234H * DST不能是CS POP CS ,例1:假设 (AX) = 2107 H , 执行 PUSH AX,* * * * * * * *,(SP),PUSH AX 执行前,(SP),* * * * * * * *,07H 21H,低地址高地址,PUSH AX 执行后,(SP),* * * * * * * *,07H 21H,POP BX 执行前,(SP),* * * * * * * *,07H 21H,低地址高地址,POP BX 执行后(BX) = 210
13、7H,例2: POP BX,例3: PUSH AXPUSH BXPUSH CX ;其间用到AX、BX、CXPOP CX ; 后进先出POP BXPOP AX,交换指令: XCHG OPR1, OPR2执行操作: (OPR1) (OPR2)注意: * 不影响标志位* 不允许使用段寄存器,例: XCHG BX, BP+SI XCHG AL, BH,输入指令 IN (完成从I/O到CPU的信息传送) 长格式: IN AL, PORT (字节) ;前256个端口IN AX, PORT (字)执行操作:(AL) ( PORT ) (字节)(AX) ( PORT+1, PORT )(字)短格式: IN A
14、L, DX (字节) ;先将端口号送DXIN AX, DX (字)执行操作:(AL) ( (DX) ) (字节)(AX) ( (DX)+1, (DX) )(字),2、累加器专用传送指令(只限于使用累加器AX或AL),输出指令 OUT (完成从CPU到I/O的信息传送)长格式: OUT PORT, AL (字节)OUT PORT, AX (字)执行操作:( PORT ) (AL) (字节)( PORT+1, PORT ) (AX)(字)短格式: OUT DX, AL (字节)OUT DX, AX (字)执行操作:( (DX) ) (AL) (字节)( (DX)+1, (DX) ) (AX)(字)
15、,注意: * 输入指令和输出指令不影响标志位* 前256个端口号00HFFH可直接在指令中指定(长格式)* 如果端口号 256,端口号 DX(短格式)例1: IN AX, 28H MOV DATA_WORD, AX 例2: MOV DX, 3FCHIN AX, DX例3: OUT 5, AL 例4: 测试某状态寄存器(端口号27H)的第2位是否为1IN AL, 27HTEST AL, 00000100BJNZ ERROR ;若第2位为1,转ERROR处理,(BX) 30 H F0040,31 H F0041,(AL) = 3 32 H F0042,33 H F0043,TABLE,(DS)=F
16、000H,换码指令:XLAT 或 XLAT OPR执行操作:(AL) ( (BX) + (AL) )(将BX中的内容和AL中的内容相加,作为有效地址EA,并在一个表格中找出该单元的内容,将其放入AL中,也称为字节查表转换指令)例:MOV BX, OFFSET TABLE ; (BX)=0040HMOV AL, 3XLAT TABLE指令执行后 (AL)=33H注意:* 不影响标志位* 字节表格(长度不超过256)首地址 (BX)* 需转换的代码位移量 (AL),3、地址传送指令,有效地址送寄存器指令(Load Effective Address): LEA REG, SRC执行操作: (REG
17、) SRC指针送寄存器和DS指令(Load DS with pointer):LDS REG, SRC执行操作: (REG) (SRC)(DS) (SRC+2)相继二字 寄存器、DS指针送寄存器和ES指令(Load ES with pointer):LES REG, SRC执行操作: (REG) (SRC)(ES) (SRC+2)相继二字 寄存器、ES,例:,40 H 00 H 00 H 30 H,TABLE (DS):1000H,MOV BX, TABLE ; (BX)=0040H MOV BX, OFFSET TABLE ; (BX)=1000H LEA BX, TABLE ; (BX)=
18、1000H LDS BX, TABLE ; (BX)=0040H; (DS)=3000H LES BX, TABLE ; (BX)=0040H; (ES)=3000H,注意: * 不影响标志位* REG 不能是段寄存器* SRC 必须为存储器寻址方式,标志送AH指令: LAHF (Load AH with Flags)执行操作: (AH) (FLAGS的低字节)AH送标志寄存器指令: SAHF (Store AH into Flags) 执行操作: (FLAGS的低字节) (AH)标志进栈指令: PUSHF (PUSH the Flags)执行操作: (SP) (SP) - 2( (SP)+1
19、, (SP) ) (FLAGS)标志出栈指令: POPF (POP the Flags)执行操作: (FLAGS) ( (SP)+1, (SP) )(SP) (SP) + 2,4、标志寄存器传送指令,* 影响标准位,CBW AL AX (Convert Byte to Word)执行操作: 若(AL)的最高有效位为0,则(AH)= 00H若(AL)的最高有效位为1,则(AH)= FFHCWD AX (DX,AX) (Convert Word to Double word)执行操作:若(AX)的最高有效位为0,则(DX)= 0000H若(AX)的最高有效位为1,则(DX)= FFFFH例:(AX
20、) = BA45HCBW ; (AX)=? CWD ; (DX)=FFFFH (AX)=BA45H注意: * 无操作数指令* 隐含对AL 或AX 进行符号扩展* 不影响标志位,5、类型转换指令,二、算术指令,1、加法指令:ADD; ADC; INC,2、减法指令:SUB; SBB; DEC; NEG; CMP,3、乘法指令:MUL; IMUL;,4、除法指令:DIV; IDIV;,加法指令: ADD DST, SRC 执行操作: (DST) (SRC) + (DST)带进位加法指令: ADC DST, SRC 执行操作: (DST) (SRC) + (DST) + CF加1指令: INC OP
21、R 执行操作: (OPR) (OPR) + 1,注意: * 除INC指令不影响CF标志外,均对条件标志位有影响。,1、加法指令,* 加法指令对状态标志位的影响,CF 位表示 无符号数相加时的进位。 OF 位表示 带符号数相加时的溢出。,1 结果为负 0 否则,SF=,1 结果为0 0 否则,ZF=,1 和的最高有效位有向高位的进位 0 否则,CF=,1 两个操作数符号相同,而结果符号与之相反(溢出) 0 否则,OF=,例:假设: (DX) = 0002H (AX) = 0F365H(BX) = 0005H (CX) = 8100H分析下列指令序列的执行结果:ADD AX, CX ; (1) A
22、DC DX, BX ; (2) (1) 执行后,(AX) = 7465H CF=1 OF=1 SF=0 ZF=0(2) 执行后,(DX) = 0008H CF=0 OF=0 SF=0 ZF=0,减法指令: SUB DST, SRC 执行操作: DST (DST) - (SRC)带借位减法指令: SBB DST, SRC 执行操作: DST (DST) - (SRC) - CF减1指令: DEC OPR 执行操作: OPR (OPR) - 1求补指令: NEG OPR 执行操作: OPR - (OPR) 比较指令: CMP OPR1, OPR2 执行操作: (OPR1) - (OPR2)执行减法
23、运算,不保存,注意: * 除DEC指令不影响CF标志外,均对状态标志位有影响。,2、减法指令,* 减法指令对状态标志位(CF/OF/ZF/SF)的影响:,CF 位表示 无符号数 减法的借位(溢出)。 OF 位表示 带符号数 减法的溢出。,1 被减数的最高有效位有向高位的借位 0 否则,CF=,1 两个操作数符号相反,而结果的符号与减数相同 0 否则,OF=,1 减法转换为加法运算时无进位 0 否则,CF=,或,例:SUB SI+14H,0136H假设指令执行前,(DS)=3000H,(SI)=0040H, (30054H)=4336H,分析指令执行完后的情况。,0040H,30000H,SI,
24、偏移量:,30054H,取出数据之后,执行减法操作:,+DS左移后:,43,36,14H,00,30,OP,4336H 0136H = 4200H,42,00,00,30,OP,SF=0,ZF=0,CF=0,OF=0,例:x、y、z 均为双精度数,分别存放在地址为X, X+2;Y, Y+2;Z, Z+2的存储单元中,用指令序列实现w x + y + 24 - z ,并用W, W+2单元存放w,MOV AX, X MOV DX, X+2 ADD AX, Y ADC DX, Y+2 ; ? ADD AX, 24 ADC DX, 0 ; x+y+24 SUB AX, Z SBB DX, Z+2 ;
25、x+y+24-z MOV W, AX MOV W+2, DX ; 结果存入W, W+2单元,无符号数乘法指令: MUL SRC带符号数乘法指令: IMUL SRC执行操作:字节操作数 AX (AL) * (SRC)字操作数 DX, AX (AX) * (SRC),注意: * AL (AX) 为隐含的乘数寄存器。 * AX (DX,AX) 为隐含的乘积寄存器。 * SRC不能为立即数。 * 除CF和OF外,对条件标志位无影响。,3、乘法指令,* 乘法指令对 CF/OF 的影响:,例:假设(AX) = 16A5H,(BX) = 0611H(1) IMUL BL ; (AX) (AL) * (BL)
26、; A5*11 5B*11=060B F9F5; (AX) = 0F9F5H CF=OF=1(2) MUL BX ; (DX, AX) (AX) * (BX); 16A5*0611=0089 5EF5; (DX)=0089H (AX)=5EF5H CF=OF=1,00 乘积的高一半为零 11 否则,MUL指令: CF,OF =,00 乘积的高一半是低一半的符号扩展 11 否则,IMUL指令: CF,OF =,1010 0101 0101 1011,无符号数除法指令: DIV SRC带符号数除法指令: IDIV SRC执行操作: 字节操作 AL (AX) / (SRC) 的商AH (AX) /
27、(SRC) 的余数字操作 AX (DX, AX) / (SRC) 的商DX (DX, AX) / (SRC) 的余数注意: * AX (DX,AX) 为隐含的被除数寄存器。* AL (AX) 为隐含的商寄存器。* AH (DX) 为隐含的余数寄存器。* SRC不能为立即数。* 对所有条件标志位均无影响。,4、除法指令,例:设X , Y , Z , V 均为16位带符号数,分别存放于相应的单元中,试编制程序计算:( V - ( X*Y + Z 540 ) ) / X,MOV AX, X IMUL Y ; x*Y (DX,AX) MOV CX, AX MOV BX, DX MOV AX, Z CW
28、D ; Z (DX,AX) ADD CX, AX ADC BX, DX ; X*Y+Z (BX,CX) SUB CX, 540 SBB BX, 0 ; X*Y+Z-540 MOV AX, V CWD ; V (DX,AX) SUB AX, CX SBB DX, BX ; V-(X*Y+Z-540) IDIV X ; (V-(X*Y+Z-540)/x(AX),余数(DX),三、逻辑指令,1、逻辑运算指令:AND; OR; NOT; XOR; TEST,2、移位指令:SHL; SAL; SHR; SAR;,ROL; ROR; RCL; RCR;,逻辑非指令:NOT OPR * OPR不能为立即数执
29、行操作: (OPR) (OPR) * 不影响标志位 逻辑与指令:AND DST, SRC执行操作: (DST) (DST) (SRC)逻辑或指令:OR DST, SRC执行操作: (DST) (DST) (SRC)异或指令: XOR DST, SRC执行操作: (DST) (DST) (SRC)测试指令: TEST OPR1, OPR2 执行操作: (OPR1) (OPR2)只做与操作,不保存结果,CF OF SF ZF PF AF0 0 * * * 无定义,根据运算结果设置,1、逻辑运算指令,例1:屏蔽AL的第0、1两位AND AL, 0FCH例2:置AL的第5位为1OR AL, 20H例3
30、:使AL的第0、1位变反XOR AL, 3例4:测试某些位是0是1TEST AL, 1JZ EVEN,* * * * * * * *OR 0 0 1 0 0 0 0 0* * 1 * * * * *,* * * * * * 0 1XOR 0 0 0 0 0 0 1 1* * * * * * 1 0,* * * * * * * *AND 1 1 1 1 1 1 0 0* * * * * * 0 0,* * * * * * * *TEST 0 0 0 0 0 0 0 10 0 0 0 0 0 0 *,2、移位指令,逻辑左移(SHift logical Left ):SHL OPR, CNT 逻辑右
31、移(SHift logical Right):SHR OPR, CNT算术左移(Shift Arithmetic Left):SAL OPR, CNT (同逻辑左移)算术右移(Shift Arithmetic Right):SAR OPR, CNT,CF 0,0 CF,CF,一般移位指令,循环左移(ROtate Left):ROL OPR, CNT循环右移(ROtate Right):ROR OPR, CNT带进位循环左移(Rotate Left through Carry):RCL OPR, CNT带进位循环右移:RCR OPR, CNT,CF,CF,CF,CF,循环移位指令,* 移位指令需
32、要注意的地方:,例:设(AX)= 0012H,(BX)= 0034H,试利用移位指令修改AX中的内容为(AX)= 1234H,例:设(BX) = 84F0H(1) 若(BX) 为无符号数,求 (BX) / 2SHR BX, 1 ; (BX) = 4278H(2) (BX) 为带符号数,求 (BX) 2 SAL BX, 1 ; (BX) = 09E0H, OF=1(3) (BX) 为带符号数,求 (BX) / 4MOV CL, 2 SAR BX, CL ; (BX) = 0E13CH,MOV CL, 8 ROL AX, CL ADD AX, BX,四、串操作指令,串操作指令通常需要与串重复前缀联
33、合使用,串重复前缀有:,REP; REPE/REPZ; REPNE/REPNZ,串操作指令有:,串传送指令 MOVS存入串指令 STOS从串取指令 LODS串比较指令 CMPS串扫描指令 SCAS,与REP联用,与REPE/REPZ/REPNE/REPNZ联用,* 串重复前缀REP (通常与MOVS、STOS、LODS等联用),重复串操作,直到计数器(CX)=0为止。,(CX)=0?,(CX) = (CX) - 1,执行串处理指令MOVS,STOS,LODS,退出REP,Y,N,格式: MOVS DST, SRC ; 必须标明字或字节 MOVSB ; 字节 MOVSW ; 字例:MOVS ES
34、: BYTE PTR DI, DS: SI执行操作:(1) (DI) + (ES)左移1位) (SI) + (DS)左移1位)(2) 字节操作:(SI)(SI)1, (DI)(DI)1字操作: (SI)(SI)2, (DI)(DI)2方向标志 DF=0 时用 + ,DF=1 时用 - 。,1、串传送指令 MOVS (MOVe String),执行 REP MOVS 之前,应先做好: (1) 源串首地址(末地址) SI (2) 目的串首地址(末地址) DI (3) 串长度 CX (4) 建立方向标志( 使用CLD 使 DF=0 或 STD 使 DF=1 ),REP MOVS:将数据段中的整串数据
35、传送到附加段中。源串(数据段) 目的串(附加段),data segmentmess1 db personal_computer data endsextra segmentmess2 db 17 dup (?) extra endscode segmentmov ax, datamov ds,axmov ax, extramov es, axlea si, mess1lea di, mess2mov cx, 17cldrep movsb code ends,例:分析程序,2、存入串指令 STOS (STOre in to String),或,格式:LODS SRCLODSB ; 字节LODSW
36、 ; 字 执行操作: 字节操作:(AL)(SI)+(DS)左移1位), (SI)(SI)1字操作:(AX)(SI)+(DS)左移1位), (SI)(SI)2,注意: * 源串一般在数据段中(允许使用段跨越前缀来修改)目的串必须在附加段中* 不影响条件标志位,3、从串取指令 LODS (LOaD from String),串比较指令CMPS和串扫描指令SCAS通常与串重复前缀REPE/REPZ/REPNE/REPNZ联用。,* 串重复前缀REPE/REPZ,重复串操作,直到计数器(CX)=0或标志位ZF=0为止。,(CX)=0/ZF=0?,(CX) = (CX) - 1,执行串处理指令CMPS或
37、SCAS,退出,Y,N,REPNE/REPNZ ?,4、串比较指令 CMPS (CoMPare String),格式: CMPS SRC, DSTCMPSB ; 字节CMPSW ; 字执行操作:(1) (SI) + (DS)左移1位) - (DI) + (ES)左移1位)根据比较结果置条件标志位:相等 ZF=1不等 ZF=0(2) 字节操作:(SI)(SI)1, (DI)(DI)1字操作: (SI)(SI)2, (DI)(DI)2加或减看方向标志位,格式: SCAS DSTSCASB (字节)SCASW (字)执行操作: 字节操作: (AL) - (DI) + (ES)左移1位), (DI)(
38、DI)1字操作: (AX) - (DI) + (ES)左移1位), (DI)(DI)2(只比较,不保存结果),5、串扫描指令 SCAS (SCAn String),串比较和串扫描指令常用于:,比较两个字符串,从字符串中查找字符,例:从一个字符串中查找一个指定的字符mess db COMPUTERlea di, messmov al, Tmov cx, 8cldrepne scasb,C,O,M,P,U,T,E,R,(di) ,(CX)=2,五、控制转移指令,1、无条件转移指令JMP 2、条件转移指令JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、JP / JNP
39、、 JB / JNB、 JL / JNL、 JBE / JNBE、 JLE / JNLE、 JCXZ 3、循环指令LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE,4、子程序调用和返回指令CALL、RET,5、中断与中断返回指令INT、IRET,1、无条件转移指令,作用:转移到指令的地址去执行从该地址开始的指令。分段内和段间转移两种。前者只需改变 IP,而后者不仅要改变IP,还要改变CS。,段内直接短转移:JMP SHORT OPR执行操作:(IP) (IP) + 8位位移量段内直接近转移:JMP NEAR PTR OPR执行操作:(IP) (IP) + 16位位移量段内间
40、接转移: JMP WORD PTR OPR执行操作: (IP) (EA),段间直接远转移:JMP FAR PTR OPR执行操作:(IP) OPR 的段内偏移地址(CS) OPR 所在段的段地址段间间接转移: JMP DWORD PTR OPR执行操作: (IP) (EA)(CS) (EA+2),2、条件转移指令,作用:当条件满足时,跳转到相应位置执行指令。,共有30条条件转移指令,可分为四类:,(1) 根据单个条件标志的设置情况转移 格式 跳转条件 JZ(JE) OPR ZF = 1 JNZ(JNE) OPR ZF = 0 JS OPR SF = 1 JNS OPR SF = 0 JO OP
41、R OF = 1 JNO OPR OF = 0 JP OPR PF = 1 JNP OPR PF = 0 JC OPR CF = 1 JNC OPR CF = 0,(2) 比较两个无符号数,并根据比较结果转移格式 跳转条件 JB (JNAE,JC) OPR CF = 1 JNB (JAE,JNC) OPR CF = 0 JBE (JNA) OPR CFZF = 1 JNBE (JA) OPR CFZF = 0* 适用于地址或双精度数低位字的比较,(3) 比较两个带符号数,并根据比较结果转移格式 跳转条件 JL (JNGE) OPR SFOF = 1 JNL (JGE) OPR SFOF = 0
42、 JLE (JNG) OPR (SFOF)ZF = 1 JNLE (JG) OPR (SFOF)ZF = 0* 适用于带符号数的比较(4) 判断 CX 的值,若为 0, 则转移格式 跳转条件 JCXZ OPR (CX)=0,例:设X、Y均为存放在X和Y单元中的16位操作数,作如下判断:如果 X50,转到TOO_HIGH;如果X-Y溢出,转到 OVERFLOW;否则计算|X-Y|,并存入RESULT。,JGJO JNS,程序如下:,3、循环指令,循环指令:LOOP OPR循环判断条件:(CX) 0为零或相等时循环指令:LOOPZ/LOOPE OPR循环判断条件:ZF=1 且 (CX) 0不为零或
43、不相等时循环指令:LOOPNZ(LOOPNE) OPR循环判断条件:ZF=0 且 (CX) 0,例 有一个首地址为ARRAY的M个字的数组,试编写一程序,求出该数组中内容之和(不考虑溢出),并把结果存入TOTAL中。MOV CX,M ;设置循环次数MOV AX,0MOV SI,AX S_LOOP: ADD AX,ARRAYSIADD SI,2LOOP S_LOOPMOV TOTAL,AX,DEC CX JNZ S_LOOP,思考:若考虑溢出,程序应如何改写?,4、子程序调用和返回指令,汇编语言中采用子程序结构,它相当于高级语言中的过程(如C的函数/C+的类)。将某些具有独立功能的部分程序编为独立的子模块,称为子程序。 子程序调用包括段内调用和段间调用两种。,code segment main proc farcall subpret main endpsubp proc nearret subp endp code ends,