300 likes | 411 Views
微机原理与接口技术. 第八讲. § 3-3 8086 的 指令系统. 指令系统. 一、数据传送指令 二、算术运算指令. 三、逻辑运算和移位指令 四、串操作指令 五、转移指令. 六、处理器控制指令. 2. § 3-3. 8086 的指令系统. 三、逻辑运算和移位指令. 逻辑运算. 算术逻辑移位. NOT. 取反. SHL/SAL. 逻辑 / 算术 左移. AND. 逻辑乘(与). SHR. 逻辑右移. OR. 逻辑加(或). SAR. 算术右移. XOR. 异或. 循环移位. TEST. 测试. ROL. 循环左移.
E N D
微机原理与接口技术 第八讲
§3-3 8086的指令系统 指令系统 一、数据传送指令 二、算术运算指令 三、逻辑运算和移位指令 四、串操作指令 五、转移指令 六、处理器控制指令 2
§3-3 8086的指令系统 三、逻辑运算和移位指令 逻辑运算 算术逻辑移位 NOT 取反 SHL/SAL 逻辑/算术左移 AND 逻辑乘(与) SHR 逻辑右移 OR 逻辑加(或) SAR 算术右移 XOR 异或 循环移位 TEST 测试 ROL 循环左移 ROR 循环右移 RCL 通过进位的循环左移 RCR 通过进位的循环右移 3
§3-3逻辑运算和移位指令 1.逻辑运算指令(Logical Operations) ⑴ NOT取反指令(Logical Not) 【8086的指令系统】 指令格式:NOT 目的 指令功能:目的 目的取反 操作数要求: ①可以是8位或16位寄存器、存储器。 ②对于存储器操作,需指明是字还是字节。 注意:指令执行后,对标志位无影响。 例 ;AX ;BL AX取反 BL取反 NOT AX NOT BL ;对存储单元字节内容取反后送回该单元 NOT BYTE PTR [BX] 4
§3-3逻辑运算和移位指令 ⑵ AND逻辑与指令(Logical AND) 指令格式:AND 目的,源 【8086的指令系统】 指令功能:目的 目的 ∧ 源 主要用于使操作数的某些位保留(和“1”相与),而使某些位清除 (和“0”相与)。 ⑶ OR逻辑或指令 (Logical OR) 指令格式:OR 目的,源 指令功能:目的 目的 ∨ 源 主要用于使操作数的某些位保留(和“0”相或),而使某些位置位 (和“1”相或)。 例 MOV AX, 3538H 0508H 3538H ;AX ;AX AND OR AX, 0F0FH AX,3030H 5
§3-3逻辑运算和移位指令 ⑷ XOR异或操作指令(Exclusive OR) 指令格式:XOR 目的,源 【8086的指令系统】 指令功能:目的 目的 ∨ 源 主要用于使操作数的某些位保留(和“0”相异或),而使 某些位取反(和“1”相异或) ⑸ TEST测试指令(Test) 指令格式:TEST 目的,源 指令功能:目的∧源 逻辑与操作,并修改标志位,但不回送结果,两个操作数都不变。 常用于在那些要检测某些条件是否满足,但又不希望改变原有操 作数的情况下。紧跟在这条指令后面的往往是一条条件转移指令, 根据测试结果产生分支,转向不同的处理程序。 6
§3-3逻辑运算和移位指令 【8086的指令系统】 AND 、 OR 、XOR和TEST指令说明: ▲源操作数可以是8位或16位立即数、寄存器、存储器; ▲目的操作数只能是寄存器、存储器,两操作数不能同时为存储器; ▲指令执行后,均将CF和OF清零,ZF、SF和 PF反映操作结果,AF未定义。 例 设AL寄存器中存有报警标志。若D7=1,表示温度报警,程序要转到温度报警 处理程序T_ ALARM;D6=1,则转压力报警程序P_ALARM。用TEST指令来 实现这种功能。 解:TEST JNZ TEST JNZ AL,80H T_ALARM AL,40H P_ALARM ;查AL的D7=1? ;是1(非零),则转温度报警程序 ;D7=0,D6=1? ;是1,转压力报警 (其中:JNZ为条件转移指令,表示结果非0 (ZF=1)则转移) 7
§3-3逻辑运算和移位指令 【8086的指令系统】 2.算术逻辑移位指令(Shift Arithmetic and Shift Logical) 这类指令可对寄存器、存储器中的字或字节的各位进行算术移位或逻 辑移位,移位的次数由指令中的计数值决定。 移位指令的操作示意图如下: CF CF MSB MSB LSB LSB 0 SAL/SHL 算术/逻辑左移 SHR逻辑右移 0 SAR算术右移 CF MSB LSB 8
§3-3逻辑运算和移位指令 【8086的指令系统】 ⑴ SAL算术左移指令(Shift Arithmetic Left) 指令格式:SAL 目的,计数值 ⑵ SHL逻辑左移指令(Shift Logic Left) 指令格式:SHL 目的,计数值 指令功能:以上两条指令的功能完全相同,均将寄存器或存储器中的 目的操作数的各位左移,每移一次,最低有效位LSB补0, 而最高有效位MSB进入标志位CF。 例 MOV AH,06H SAL AH,1 MOV CL,03H SHL DI,CL SAL BYTE PTR [BX] ;AH=06H=00000110B ;将AH的内容左移1次,AH=00001100B ;将DI的内容左移3次 ;将内存单元的字节左移1位 9
§3-3逻辑运算和移位指令 【8086的指令系统】 注意: ▲移动一次,相当于将目的操作数乘以2; ▲计数值就是所要移位的次数。 若移位一次,直接将计数值置1; 移位次数大于1,将移位次数送进CL,再把CL放在计数值位置上。 ▲对标志位的影响: 移位次数为1时,若移位后最高位的值被改变,OF置1,否则OF清0。 多次移位时,OF的值不确定。 不论移多少次,CF总是等于目的操作数最后被移出去的值。SF和 ZF 将 根据指令执行后目的操作数的状态来决定,PF只有当目的操作数在AL 中时才有效,AF不定。 10
§3-3逻辑运算和移位指令 【8086的指令系统】 ⑶ 逻辑右移指令(Shift Logic Right) 指令格式:SHR 目的,计数值 指令功能:各位进行右移。每移一次,低位进入CF,最高位补0。 注意:若目的操作数为无符号数,每右移一次,目的操作数除以2,余数被 丢掉。 例用右移的方法作除法133/8=16…5。 解:MOV MOV SHR AL,1000 0101B CL,03H AL,CL ;AL=133 ;CL=移位次数 ;右移3次 结果:指令执行后,AL=10H=16,余数5被丢失。标志位CF、AF不定。 11
§3-3逻辑运算和移位指令 【8086的指令系统】 ⑷ SAR算术右移指令(Shift Arithmetic Right) 指令格式:SAR 目的,计数值 指令功能:各位右移。每移位一次,最低位进入CF,但最高位(即符号位) 保持不变。 注意:每移一次,相当于对带符号数进行除2操作。 例用SAR指令计算-128/8=-16。 解:MOV AL,1000 0000B MOV CL,03H ;AL=-128 ;右移次数3 ;算术右移3次后,AL=0F0H= -16 12 AL,CL SAR
§3-3逻辑运算和移位指令 【8086的指令系统】 3.循环移位指令(Rotate) 算术逻辑移位指令,移出操作数的数位均被丢失;循环移位指令把操作数从 一端移到另一端,移出的位不丢失。循环移位指令共四条:操作如图所示。 ⑴ ROL循环左移指令(Rotate Left) 指令格式:ROL 目的,计数值 ⑵ ROR循环右移指令(Rotate Right) 指令格式:ROR 目的,计数值 ⑶ RCL通过进位位循环左移(Rotate through Carry Left) 指令格式:RCL 目的,计数值 ⑷ RCR通过进位位循环右移(Rotate through Carry Right) 指令格式:RCR 目的,计数值 13
§3-3逻辑运算和移位指令 循环移位指令操作示意图 【8086的指令系统】 ROL 循环左移 ROR 循环右移 RCL 通过进位位的 LSB LSB LSB CF CF CF MSB MSB MSB 循环左移 CF MSB LSB RCR 通过进位位的 循环右移 14
§3-3逻辑运算和移位指令 【8086的指令系统】 注意: 循环移位后:结果 → 目的操作数。 目的操作数可以是8/16位的寄存器、存储器,移位的次数可以是1, 也可以由CL寄存器的值指定。 关于标志位: ROL和ROR指令没有把进位标志CF包含在循环中;而RCL和RCR指 令把CF作为整个循环的一部分,一起参加循环移位。 CF的值总是由最后一次被移出的值决定。 OF位只有在移位次数为1的时候才有效。在移位后最高有效位发生变 化(由1变0或由0变1)时,则OF置1,否则OF置0。在多位循环移位时, OF值不确定。 15
§3-3逻辑运算和移位指令 例 【8086的指令系统】 ROL BX,CL ;BX中的内容不带进位左移CL中规定的次数 ROR WORD PTR [SI] ;DS×16+SI单元的字不带进位移1次 例 设CF=1,AL=1011 0100B 若执行指令ROL AL,1 若执行指令ROR AL,1 若执行指令RCR AL,1 若执行指令MOV CL,3 RCL AL,CL ;则AL=0110 1001B,CF=1,OF=0 ;则AL=0101 1010B,CF=0,OF=1 ;则AL=1101 1010B,CF=0,OF=0 ;则AL=1010 0110B,CF=1,OF不确定 16
§3-3 8086的指令系统 四、字符串处理指令 相关概念 字符串:一系列存放在存储器中的字或字节数据,不管 它们是不是ASCII码。字符串长度可达64K字节。 字符串元素:组成字符串的字节或字。每种字符串指令 对字符串元素只进行同一种操作。 字符串操作指令:对字符串进行的传送、比较、扫描、 存储及装入等5种操作。 17
§3-3字符串处理指令 字符串操作指令的类型和格式 【8086的指令系统】 字节/字操作 MOVS 目的串,源串 CMPS 目的串,源串 SCAS 目的串 LODS 源串 STOS 目的串 指令名称 字符串传送 字符串比较 字符串扫描 字符串装入 字符串存储 字节操作 MOVSB CMPSB SCASB LODSB STOSB 字操作 MOVSW CMPSW SCASW LODSW STOSW 说明: 每种指令都有3种格式。有两种方法用以说明是字节操作还是字操作。 方法一:用指令中的源串和目的串名(即操作数)来表明是字节还是字; 方法二: 在指令助记符后加B说明是字节,加W说明是字操作。 18
§3-3字符串处理指令 【8086的指令系统】 关于隐合约定: ①源串:起始地址( 或末地址) 为DS :SI 。源串允许使用段超越前缀来修 改段地址。 ②目的串:起始地址(或末地址)为ES:DI。目的串不允许使用段超越前缀修 改ES。如果要在同一段内进行串运算,必须使DS和ES指向同一段。 ③指针:每执行一次字符串指令,指针SI和DI会自动修改,以指向下一个待 操作单元。 ④DF标志:控制字符串处理的方向。 DF=0为递增方向。DS:SI指向源串首地址,每执行一次串操作: 字节串操作时,SI、DI分别增1;字串操作时,SI和DI分别增2; DF=1为递减方向。DS:SI指向源串末地址,每执行一次串操作: 字节串操作时减1;字串操作时减2。 STD使DF置1,CLD将DF清0。 ⑤串长度:要处理的字符串长度(字节或字数)放在CX寄存器中。 19
§3-3字符串处理指令 【8086的指令系统】 关于重复前缀: ①功能: 在基本指令前加重复前缀,可加快串运算指令的执行速度。每重复执行一 次,地址指针SI和DI按方向标志自动修改,CX的值自动减1。 ②类型与格式: REP:无条件重复(Repeat),常与 (MOVS)连用,连续传送字符串。 直到传送完毕,即CX=0为止。 REPE/REPZ:相等/结果为零则重复(Repeat while Equal/Zero),常与(CMPS)连用, 连续比较字符串。当两个字符串对应字符相等(ZF=1)和CX≠0时, 则重复进行比较,直到ZF=0或CX=0为止。 REPNE/REPNZ:不相等/结果非零则重复(Repeat while Not Equal/Not Zero), 常与 (SCAS)连用,当结果非0(ZF=0)和CX≠0时,重复进行扫描,直 到ZF=1或CX=0为止。 带有重复前缀的串指令执行过程中允许有中断进入。 20
§3-3字符串处理指令 【8086的指令系统】 1.MOVS字符串传送指令(Move String) 指令格式:MOVS 目的串,源串 指令功能:SI作指针的源串中的一个字节或字 DI作指针的目的串; 自动修改指针SI和DI。 指令应用: ▲解决MOV指令不能直接在存储单元间进行数据传送的问题。 ▲若使用重复前缀,还可以利用一条指令传送一批数据。 例 要求把数据段中以SRC_MESS为偏移地址的一串字符“HELLO!”,传 送到附加段中以NEW_LOC开始的单元中。 21
§3-3字符串处理指令 【8086的指令系统】 ;数据段 DATA SEGMENT ‘HELLO!’ ;源串 SRC_MESS DATA DB ENDS ;附加段 ;存放目的串 EXTRA NEW_LOC EXTRA CODE SEGMENT DB 6 DUP(?) ENDS SEGMENT ASSUME CS:CD, DS:DATA, ES:EXTRA START: MOV AX,DATA ;DS=数据段段址 ;ES=附加段段址 ;SI指向源串偏移地址 ;DI指向目的串偏移地址 ;CX作串长度计数器 ;清方向标志,地址增量 ;重复传送串中各字节,直到CX=0 MOV DS,AX MOV AX,EXTRA MOV EX,AX LEA SI,SRC_MESS LEA DI,NEW_LOC MOV CX,6 CLD REP MOVSB 其中“REP MOVSB”指令可用以下几条指令代替: AGAIN: MOVSB DEC CX JNZ AGAIN 22
§3-3字符串处理指令 【8086的指令系统】 2.CMPS字符串比较指令(Compare Sting) 指令格式:CMPS 目的串,源串 指令功能:SI作指针的源串数据减去DI作指针的目的串数据,结果反映在标志位上; 两个数据串的原始值不变;源串和目的串指针自动修改,指向下一对待 比较的串。 加重复前缀: ▲REPE/REPZ CMPS ;直至CX=0(比较结束)或ZF=0(两串不相等)时停止操作。 ▲REPNE/REPNZ CMPS;直至CX=0(比较结束)或ZF=1(两串相等)时停止比较。 例 比较两个字符串,一个是程序中设定的口令串PASSWORD,另一个是从键盘输 入的字符串IN_WORD,若输入串与口令串相同,程序将开始执行。否则,程序 驱动PC机的扬声器发声,警告用户口令不符,拒绝往下执行。 这可以用CMPS指令来实现,有关程序段如下: 23
§3-3字符串处理指令 【8086的指令系统】 ;数据段 DATA SEGMENT ;口令串 ;从键盘输入的串 ;串长度 PASSWORD IN_WORD COUNT DATA DB DB EQU ENDS ‘750424LI’ ‘750424LE’ 8 …… ;代码段 CODE SEGMENT …… ;源串指针 ;目的串指针 ;串长度 ;地址增量 ;CX≠0且串相等时重复比较 ;若不相等,转发声程序 LEA LEA MOV CLD REPZ JNE SI, PASSWORD DI, IN_WORD CX, COUNT CMPSB SOUND ;比完且相等,往下执行 ;使PC机扬声器发声 ;并退出 OK: SOUND: CODE …… …… …… …… ENDS 24
§3-3字符串处理指令 【8086的指令系统】 3. SCAS字符串扫描指令(Scan String) 指令格式:SCAS 目的串 指令功能:AL/AX(字节/字操作)内容减去ES:DI中的串元素,结果反映在标志位 上,源操作数不变,操作后目的串指针会自动修改,指向下一个待搜 索的串元素。 指令应用: ▲ 利用SCAS指令,可在内存中搜索关键字。指令执行前,必须事先将关键字 存在AL(字节)或AX(字)中,才能用SCAS指令进行搜索。 ▲ SCAS指令可以加重复前缀。 25
§3-3字符串处理指令 【8086的指令系统】 例 在某一字符串中搜寻是否有字符A,若有,则把搜索次数记下来,送到 BX寄存器中,若没有查到,则将BX寄存器清0。设字符串起始地址STRING的 偏移地址为0,字符串长度为CX。 解: MOV DI,OFFSET STRING ;DI=字符串偏移地址 MOV CX,COUNT MOV AL,‘A’ CLD REPNE SCASB JZ FIND ;CX=字符串长度 ;AL=关键字A的ASCII码 ;清标志方向 ;CX≠0(没查完)和ZF=0(不相等)时重复 ;若ZF=1,表示已搜到,转出 MOV DI,0 FIND: MOV BX,DI ;若ZF=0,表示没搜到,DI 0 ;BX 搜索次数 HLT 说明: DI初值存起始地址偏移量0,搜索一次后,DI自动加1,使DI的值等于1; 每执行一次搜索操作,DI自动增1; 因此可用DI的值表示搜索次数。 26
§3-3字符串处理指令 【8086的指令系统】 4.LODS数据串装入指令(Load String) 指令格式:LOAD 源串 指令功能:DS:SI中的串元素 AL/AX(字节/字操作)中,修改SI,以指向串 中的下一个元素,修改量遵守隐含约定⑷。 注:该指令加重复前缀意义不大,因为重复传送只能保留最后写入的数据。 5.STOS数据串存储指令(Store string) 指令格式:STOS 目的串 指令功能:AL/AX( 字节/ 字操作) 的一个字节或字 ES:DI 所指的目的串; 修改DI,以指向串中的下一个单元。 关于重复前缀:“REP STOS” ,可用累加器中的常数,对数据串进行初始化。如 初始化为全0串 27
§3-3字符串处理指令 【8086的指令系统】 例若在数据段中有一个数据块,起始地址为BLOCK,数据块中的数为8位带符号 数,要求将其中所含的正、负数分开,然后把正数送到附加段中始址为 PLUS_DATA的缓冲区,负数则送到附加段中始址为MINUS_DATA的缓冲区。 把数据块作为数据串处理: 用SI作源串指针; DI和BX分别作正、负数目的缓冲区的指针; CX用于控制循环次数。 技巧: 使用STOSB指令必须以SI为源指针,DI为目的指针; 负数区的目的指针在BX中,要用XCHG指令将BX内容送进DI,让DI指向负数 区,同时也把DI中的正数区目的指针保护了起来; 执行STOSB 指令后,再用XCHG 指令交换回来,以便下次重复执行时(转回 GOON标号后),LODS指令仍能正确执行。 写出如下程序段: 28
§3-3字符串处理指令 【8086的指令系统】 ; SI为源串指针 ; DI为正数目的区指针 ; BX为负数目的区指针 ; CX放循环次数 ; AL←源操作数的一个字节 ; 是负数? ; 是,转MINUS ; 非负数,将字节送正数区 ; 处理下一个字节 ; 交换正负数指针 ; 负数送入负数区 ; 恢复正负数指针 ; 次数减1 ; 未处理完,继续传送 ; 停机 29 START: MOV MOV MOV MOV CLD GOON: LODS TEST JNZ STOSB JMP MINUS: XCHG STOSB XCHG AGAIN: DEC JNZ HLT SI, OFFSET BLOCK DI, OFFSET PLUS_DATA BX, OFFSET MINUS_DATA CX, COUNT BLOCK AL, 80H MINUS AGAIN BX, DI BX, DI CX GOON
小 结 1.重点 寻址方式、指令系统 2.难点 指令的正确应用 3.作业 30