微机原理 第三章5
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
寄存器AL中是字母‘Y’或‘y’,则令AH=0,否则令AH=…… CMP JE AL,’y’ NEXT
CMP
JE MOV JMP NEXT:
AL,’Y’
NEXT AH,-1 DONE
MOV
DONE: ……
AH,0
测试CX的值作为转移的依据:
JCXZ LABEL ;当CX=0,转移
分支程序结构
[例]
[例]
编写程序段,将DX:AX中的双字右移4位。 MOV SHR MOV SHR SHL OR CL,4 AX,CL BL,DL DX,CL BL,CL AH,BL
;保留DL的值
;将DX向右移出的4位加到 ; AH的高4位
DH
DL DL
DX
DH
4bit
AH AL AL
AX
AH
丢弃
控制转移类指令
BX ; IPBX
例如:
JMP
WORD
PTR
[BX]
IPDS:[BX的偏移地址]所指向的字存储单元的内容
4)段间直接(远)转移 格式:JMP FAR PTR LABEL
执行的操作:IPLABEL的段内偏移地址
CSLABEL所在段的段地址
5)段间间接转移
JMP DWORD PTR mem32
1、 逻辑运算指令
AND OR XOR TEST NOT dst,src dst,src dst,src dst,src reg/mem ;逻辑与指令:dstdst∧src ;逻辑或指令:dstdst∨src ;逻辑异或指令:dstdst⊕src ;测试指令:dst∧src ;逻辑非指令reg/mem~reg/mem
逻辑运算与移位类指令
当需要对字节或字数据中的各个二进制位进行操作时,可 以考虑采用逻辑运算与移位类指令。 ADD、ADC、SUB、SBB、CMP和AND、OR、XOR、TEST具有相同 的指令格式:
运算指令助记符 运算指令助记符
reg,imm/reg/mem mem,imm/reg
以上格式表明了操作数的寻址方式。也可统一表示为: 运算指令助记符 dst, src
; 相 等 循 环 : CXCX-1; 若 CX≠0 且 ZF=1, 转 移 LOOPNE/LOOPNZ LABEL
;不等循环:CXCX-1;若CX≠0且ZF=0,转移 LOOP指令首先将CX减1,然后判断计数值CX是否为0;若CX不 为 0 , 则 转 移 到 标 号 处 执 行 ; 等 于 0 , 顺 序 执 行 。 LOOPE 和 LOOPNE又要求同时ZF=1或ZF=0才进行转移,用于判断结果是否 相等(或为0),以便提前结束循环。标号到循环指令之间的 代码序列就是循环体。
循环移位指令的操作数形式(寻址方式)和移位指令相同 ,按指令功能设置进位标志CF,不影响AF、ZF、PF、SF标 志。对OF的影响,循环移位指令同移位指令是一样的。
[例] 实现32位数的联合左移1位:高16位在DX中,低16位在 AX中。(相当于 (DX:AX)×2 ) SAL AX,1 RCL DX,1
Jcc LABEL ;条件满足,发生转移: ;IPIP+8位的位移量; ;否则,顺序执行。
注意:
① 条件转移指令Jcc只支持段内短转移的寻址方式,只能实现 段内-128~127个单元范围的跳转,其间共有多少条指令是不确 定的。 ② 条件转移指令不影响标志,但利用状态标志作为控制转移 的条件。Jcc中的cc表示利用标志判断的条件。同一条指令可能 有多个助记符形式,这只是为了利于记忆,方便使用。 ③ 因为条件转移指令要利用影响标志的指令执行后所设置的 标志状态以形成判断条件,所以在条件转移指令之前,常有 CMP、TEST、加减运算、逻辑运算、CMPS、SCAS等指令。
[例] TEST JZ ADD
将AX中的无符号数除以2,如果是奇数则加1后除以2。 AX,01H ;测试AX的最低位D0 ;ZF=0, 即D0=1:AX是奇数,AXAX+1
SET_EVEN ;ZF=1,即D0=0:AX是偶数,程序转移 AX,1
SET_EVEN:
SHR
AX,1
;AXAX/2
[例] 1。
Disp=08H 0100H 0101H 0102H Disp=08H 010AH(HELLO) 010BH
MOV指令
新的IP
2)段内直接近转移 格式:JMP NEAR PTR
可以省略
LABEL
执行的操作:IPIP + 16位的位移量 3)段内间接转移
JMP
r16/m16
JMP
;IPr16/m16
指令用来测试AL的最高位为0还是1。相与结果为0,ZF=1, 表示AL的最高位为0,表示AL符号位为0;否则为1,ZF=0,可以 表明AL是有符号数的负数。
练习:
1、用一条逻辑运算指令 清除 BX 寄存器。
2、用一条逻辑运算指令 使 DX 的高3位为1,
其余的位保持不变。
3、用一条逻辑运算指令使 BL 的低4位为0,
其余的位保持不变。
4、用一条逻辑运算指令使AX中和BX中的对应位
不相同的位均置位 为1。
1、XOR
AND 2、OR 3、AND 4、XOR
BX,BX
BX,0
或
DX,1110000000000000B BL,11110000B AX,BX
2、 移位指令
SHL(shift logical left) 逻辑左移 SAL(shift arithmetic left) 算术左移 SHR(shift logical right) 逻辑右移 SAR(shift arithmetic right) 算术右移 ROL(rotate left) 循环左移 ROR(rotate right) 循环右移 RCL(rotate left through carry) 带进位循环左移 RCR(rotate right through carry)带进位循环右移
将AX和BX中较大的数值存放在WMAX单元。
CMP AX,BX JAE NEXT ;比较AX和BX ;若AX>=BX(无符号数),转移到NEXT处
XCHG AX,BX ;若AX<BX,交换 NEXT: MOV WMAX,AX
如果认为AX、BX存放的是有符号数,
则条件转移指令用JGE。
3、循环控制指令 8088 CPU设计了一系列针对计数器CX的循环控制指令。 LOOP LABEL ;循环:CXCX-1;若CX≠0,转移到LABEL执行 LOOPE/LOOPZ LABEL
无任何先决条件就能使程序改变执行的顺序。
1)段内直接短转移 格式:JMP SHORT LABEL
指令的标号
执行的操作:IPIP + 8位的位移量
8bit Disp = LABEL的EA – 当前指令执行后的IP的值
[例如] ……
JMP
…… HELLO: MOV ……
SHORT HELLO
AL,3
代码段 JMP指令 JMP执行后 IP = ...... B0H 03H EBH 08H
[例] XOR SHL MOV SHL SHL ADD
将AL寄存器的无符号数乘以10。 AH,AH ;利用异或运算,实现AH=0,同时CF=0 AX,1 ;AX2*AL BX,AX ;保存BXAX=2*AL AX,1 ;AX4*AL AX,1 ;AX8*AL AX,BX ;AX8*AL+2*AL=10*AL
SAR reg/mem,1/CL ;算术右移:reg/mem右移1/CL位,最高位不变, ;最低位进入CF
符号位
注意:
① 四条(实际为三条)移位指令的目的操作数可以是寄存器 或存储单元,后一个操作数表示移位的位数,为1表示移动一 位;移位位数大于1,则由CL寄存器的值表示。 ② 移位指令按照移入的位来设置CF,根据移位后的结果影响 SF、ZF和PF,对AF没有定义;如果进行一位移动,则按照操 作数的最高符号位是否改变来确定OF,有改变,OF=1;否则, OF=0。移位次数大于1,OF不确定。 ③ 逻辑移位指令和算术移位指令可以实现无符号数和有符号 数的乘或除2、4、8……。左移相当于乘2,右移相当于除2, 商在操作数中,余数由CF标志反映。
3、
循环移位指令
循环移位指令类似移位指令,但要求将一端移出的位返回 到另一端形成循环。可分为不带进位循环移位和带进位循环移 位指令,分别具有左移和右移操作。 ROL ROR RCL RCR reg/mem ,1/CL reg/mem ,1/CL reg/mem ,1/CL reg/mem ,1/CL ;不带进位循环左移 ;不带进位循环右移 ;带进位循环左移 ;带进位循环右移
C2
ENDS
代码段C1 EAH 50H JMP指令
02H
00H
新IP=0250H 新CS=2000H
20H
...... 代码段C2 ...... NEXT_PROG
20000H 20250H
段间直接转移举例
2、条件转移指令
Jcc
条件转移指令Jcc根据指定的条件确定程序是否转移。 如果满足条件,则程序转移到目的地址去执行程序; 如不满足条件,则程序将顺序执行下一条指令。
逻辑运算指令用来对字节或字数据按位进行逻辑运算。 AND: 只有相“与”的两个位都为1,结果才是1;否则结果为0; OR: 只要相“或”的两位有一个为1,结果是1;否则结果为0; NOT: 原来为0的位置为1;原来为1的位置为0; XOR: 相“异或”的两位不相同时结果为1,相同时结果为0;
①双操作数逻辑运算指令均设置CF=OF=0,根据结果设置SF、ZF 和PF,对AF未定义。NOT指令不影响状态标志位。 [例] MOV AL,75H ;AL75H AND AL,32H ;AL30H,CF=OF=0、SF=0、ZF=0、PF=1 OR AL,71H ;AL71H,CF=OF=0、SF=0、ZF=0、PF=1 XOR AL,0F1H ;AL80H,CF=OF=0、SF=1、ZF=0、PF=0 NOT AL ;AL7FH,不改变状态标志位 ②逻辑运算指令除了可以进行逻辑运算以外,经常用来处理操 作数的某些位,例如可屏蔽某些位(将这些位置0),或使某 些位置1,或将某些位取反,或使用TEST指令测试某些位。 [例] MOV AL,01011111B AND AL,11111100B;AL01011100,屏蔽AL的第0、1两位 OR AL,00100000B;AL01111100,将AL的第5位置1 XOR AL,00110000B;AL01001100,将AL的第4、5位取反 XOR AX,AX ;作用?
TEST指令对两个操作数执行按位逻辑与的运算,但结果不 送目的操作数,只根据结果设置状态标志位。TEST指令通常用 于检测操作数中某些位的状态,但又不希望改变原操作数的情 况。这条指令之后,一般都是条件转移指令,目的是利用测试 结果对状态标志位的影响作为判断条件转向不同的程序段。
[例] TEST AL,80H
移位指令助记符 opr, count
mem/reg
为1或CL
SHL reg/mem,1/CL ;逻辑左移:reg/mem左移1/CL位,最低位补 ;零,最高位进入CF
SHR reg/mem,1/CL ;逻辑右移:reg/mem右移1/CL位,最高位补0, ;最低位进入CF SAL reg/mem,1/CL ;算术左移:与SHL是同一条指令
[例] 将DB_BCD开始的两个字节2位非压缩BCD码合并到DL中。 DB_BCD DB 04H,08H …… MOV DL,DB_BCD ;取低字节 AND DL,0FH ;屏蔽高四位,保留低四位 MOV DH,DB_BCD+1 ;取高字节 MOV CL,4 ;设置循环移位次数 SHL DH,CL ;移到高4位,或用ROL DH,CL OR DL,DH ;合并,或使用ADD DL,DH
执行的操作:IPmem32 低地址对应的字
CSmem32 高地址对应的字
例: JMP
JMP
DWORD PTR [SI]
DWORD PTR ALPHA[BP][DI]
例如:C1
SEGMENT
…… JMP FAR PTR
段间直接转移
NEXT_PROG
……
C1 ENDS …… C2 SEGMENT …… NEXT_PROG: ……
指令安排在代码段,CS和IP不能直接修改。
* 与转移有关的寻址方式:
[1Βιβλιοθήκη Baidu 直接寻址方式;
[2]
间接寻址方式。
* 转移的范围:
[1]
[2]
段内短转移 :-128~127 Byte;
段内近转移 :-32768~32767 Byte;
[3]
段间转移
:在1MB 地址空间 范围内。
1、无条件转移指令
JMP(jump)