1.11k likes | 1.3k Views
第 5 章 指令系统. 第二部分. 计算机教学实验中心. 三、逻辑运算和移位类. 与 或 非 异或. 逻辑运算 移位操作. 逻辑移位 算术移位. 非循环移位 循环移位. 不带进位位的移位 带进位位的移位. 1. 逻辑运算. 逻辑运算指令对操作数的要求大多与 MOV 指令相同。 “ 非 ” 运算指令要求操作数不能是立即数; 除“非”运算指令外,其余指令的执行都会使标志位 OF=CF=0. “ 与”指令. 格式: AND OPRD1 , OPRD2 操作: 两操作数按位相 “ 与 ” ,结果送目标地 址.
E N D
第5章指令系统 第二部分 计算机教学实验中心
三、逻辑运算和移位类 与 或 非 异或 逻辑运算 移位操作 逻辑移位 算术移位 非循环移位 循环移位 不带进位位的移位 带进位位的移位
1.逻辑运算 • 逻辑运算指令对操作数的要求大多与MOV指令相同。“非”运算指令要求操作数不能是立即数; • 除“非”运算指令外,其余指令的执行都会使标志位OF=CF=0
“与”指令 • 格式: AND OPRD1,OPRD2 • 操作: 两操作数按位相“与”,结果送目标地 址
“与”指令的应用 • 实现两操作数相与的运算; • 使目标操作数的某些位不变,某些位清零; • 在操作数不变的情况下使CF和OF清零。
“与”指令的应用 • AND BL,[BX] • AND AL,0FH • AND AX,AX
“或”运算指令 • 格式: OR OPRD1,OPRD2 • 操作: 两操作数按位相“或”,结果送目标 地址
“或”运算指令的应用 • 实现两操作数相“或”的运算; • 使某些位不变,某些位置“1” • 在不改变操作数的情况下使OF=CF=0
应用程序例 OR AX,[DI] OR CL,0FH OR AX,AX OR AL,AL JPE GOON OR AL,80H GOON:…. 将一个二进制数9变为字符‘9’ 偶校验转移 (PF=1) ?
“非”运算指令 • 格式:NOT OPRD • 操作:操作数按位取反再送回原地址 • 指令中的操作数不能是立即数 • 指令的执行对标志位无影响 • 例:NOT BYTE PTR[BX]
“异或”运算指令 • 格式: XOR OPRD1,OPRD2 • 操作: 两操作数相“异或”,结果送目标 地址 • 两操作数自身相异或,结果 XOR AX,AX
“测试”指令 • 格式: TEST OPRD1,OPRD2 • 操作: 执行“与”运算,但运算的结果不 送回目标地址。 • 应用: 常用于测试某些位的状态
“测试”指令例 • 从地址为38F0H的端口中读入一个字节数,如果该数的bit1位为1,则可从38FEH端口将DATA为首地址的一个字输出,否则就不能进行数据传送。 编写相应的程序段。
“测试”指令例 开 始 测试bit1位状态 取待输出数的偏移地址 N Bit1=1? Y 取输入口地址 取输出口地址 读入状态字 输出一个字
“测试”指令例 LEA SI,DATA MOV DX,38F0H WATT:IN AL,DX TEST AL,02H JZ WATT ;ZF=1转移 MOV DX,38FEH MOV AX,[SI] OUT DX,AX
2.移位指令 • 非循环移位指令 • 循环移位指令 • 注: 移动一位时由指令直接给出;移动两位及以上,则移位次数由CL指定。
非循环移位指令 • 逻辑左移 • 算术左移 • 逻辑右移 • 算术右移
算术左移和逻辑左移 • 格式: SAL OPRD,1 SAL OPRD,CL SHL OPRD,1 SHL OPRD,CL 有符号数 无符号数 逻辑左移 移动一位后,若CF与最高不相等,则OF=1;否则OF=0
逻辑右移 • 格式: SHR OPRD,I SHR OPRD,CL 无符号数的右移 0 CF 移动一位后,若次高位与最高位不相等,则OF=1;否则OF=0
算术右移 • 格式: SAR OPRD,I SAR OPRD,CL 有符号数的右移 CF
非循环移位指令的应用 • 左移可实现乘法运算 • 右移可实现除法运算 见教材p198例
循环移位指令 左移 ROL 右移 ROR 不带进位位的循环移位 带进位位的循环移位 循环移位指令的格式、对操作数的要求与非循环移位指 令相同 左移 RCL 右移 RCR
不带进位位的循环移位 CF CF
带进位位的循环移位 CF CF
循环移位指令的应用 • 用于对某些位状态的测试; • 高位部分和低位部分的交换; • 与非循环移位指令一起组成32位或更长字长数的移位。
程序例 PUSH CX MOV CL,4 SHR AL,CL OR AL,30H MOV [DI],AL INC DI INC SI POP CX DEC CX JNZ BBB HLT MOV SI,1000H MOV DI,3000H MOV CX,4 BBB:MOV AL,[SI] MOV BL,AL AND AL,0FH OR AL,30H MOV [DI],AL INC DI MOV AL,BL 程序 功能?
程序功能 • 将1000H开始存放的四个压缩BCD码转换为ASCII码存放在3000H开始的单元中去。 ┇ 12H 1000H 34H 56H 78H ┇ 3000H ┇
四、串操作指令 • 针对数据块或字符串的操作; • 可实现存储器到存储器的数据传送; • 待操作的数据串称为源串,目标地址称为目标串。
串操作指令的特点 • 源串一般存放在数据段,偏移地址由SI指定。允许段重设; • 目标串必须在附加段,偏移地址由DI指定; • 指令自动修改地址指针,修改方向由DF决定。DF=0 增地址方向;DF=1 减地址方向; • 数据块长度值由CX指定; • 可增加自动重复前缀以实现自动修改CX内容。
串操作指令流程 取源串地址 传送一个字节或字 取目标串地址 修改地址指针 设串长度 修改串长度值 传送完否?
重复前缀 • REP 无条件重复 • REPE 相等重复 • REPZ 为零重复 • REPNE 不相等重复 • REPNZ 不为零重复 CX≠0 重复 CX≠0ZF=1 条件重复 CX≠0ZF=0
串操作指令 • 串传送 MOVS • 串比较 CMPS • 串扫描 SCAS • 串装入 LODS • 串送存 STOS
串传送指令 • 格式: MOVS OPRD1,OPRD2 MOVSB MOVSW 指令用于实现数据块的传送,常与无条件重复前缀连用。
串传送指令 • 对比用MOV指令和MOVS指令实现将200个字节数据从内存的一个区域送到另一个区域的程序段。
串传送指令例 • 用串传送指令实现200个字节数据的传送: LEA SI,MEM1 LEA DI,MEM2 MOV CX,200 CLD REP MOVSB HLT
串比较指令 • 格式: CMPS OPRD1,OPRD2 CMPSB CMPSW • 该指令用于两个数据块或两个字符串之间的比较; • 常与条件重复前缀连用,指令的执行不改变操作数,仅影响标志位。
串比较指令例 • 测试上例中200个字节数据是否传送正确: LEA SI,MEM1 LEA DI,MEM2 MOV CX,200 CLD REPE CMPSB JZ STOP DEC SI MOV AL,[SI] MOV BX,SI STOP:HLT
串扫描指令 • 格式: SCAS OPRD SCASB SCASW • 指令执行:AX(或AL)- OPRD • 该指令常用于在某个区域中寻找关键字。 目 标 操作数
串装入指令 • 格式: LODS OPRD LODSB LODSW • 操作:对字节: AL ([DS:SI]) 对 字: AX ([DS:SI]) 源操作数
串装入指令 • 用于将内存某个区域的数据串依次装入累加器,以便显示或输出到接口。 • LODS指令一般不加重复前缀。
串送存指令 • 格式: STOS OPRD STOSB STOSW • 操作:对字节: AL ([ES:DI]) 对 字: AX ([ES:DI]) 目 标 操作数
串送存指令的应用 • 将内存某个区域清零 开始 0送累加器AL 区域首地址送ES:DI 执行串送存指令 串长度送CX 置方向标志DF
五、程序控制指令 • 转移指令 • 循环控制 • 过程调用 • 中断控制
1.转移指令 • 无条件转移指令 无条件转移到目标地址,执行新的指令 • 有条件转移指令 在具备一定条件的情况下转移到目标地址
转移指令的转移原理 • 通过修改代码段寄存器CS及指令指针IP的内容,使程序改变顺序执行的模式,转到新的目标地址执行。
无条件转移指令 • 指令格式: JMP OPRD • 无条件转移的目标地址可以是在当前代码段,也可在另一代码段
无条件转移指令 • 段内转移——目标地址与JMP指令在同一代码段 • 转移方式: 直接转移——指令中直接给出转移的目标地址 间接转移——由指令中的寄存器或存储器间接给出转移 目标地址
无条件段内转移 • 直接转移: JMP Lable • 转移目标地址: 段基地址不变; 偏移地址=当前IP+位移量 近地址标号 ┇ JMP 位移量 代码段 ┇ Label ┇
无条件段内转移 ┇ • 间接转移: JMP BX JMP WORD PTR[BX] JMP 代码段 ┇ 指令码 IP ┇ BX=1200 数据段 XXH XXH ┇
无条件段间转移 • 直接转移: JMP FAR Lable ┇ JMP 代码段1 XXH IP XXH 远地址标号 XXH CS XXH ┇ 代码段2 Label ┇