1 / 30

微机原理与接口技术

微机原理与接口技术. 第八讲. § 3-3 8086 的 指令系统. 指令系统. 一、数据传送指令 二、算术运算指令. 三、逻辑运算和移位指令 四、串操作指令 五、转移指令. 六、处理器控制指令. 2. § 3-3. 8086 的指令系统. 三、逻辑运算和移位指令. 逻辑运算. 算术逻辑移位. NOT. 取反. SHL/SAL. 逻辑 / 算术 左移. AND. 逻辑乘(与). SHR. 逻辑右移. OR. 逻辑加(或). SAR. 算术右移. XOR. 异或. 循环移位. TEST. 测试. ROL. 循环左移.

Download Presentation

微机原理与接口技术

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 微机原理与接口技术 第八讲

  2. §3-3 8086的指令系统 指令系统 一、数据传送指令 二、算术运算指令 三、逻辑运算和移位指令 四、串操作指令 五、转移指令 六、处理器控制指令 2

  3. §3-3 8086的指令系统 三、逻辑运算和移位指令 逻辑运算 算术逻辑移位 NOT 取反 SHL/SAL 逻辑/算术左移 AND 逻辑乘(与) SHR 逻辑右移 OR 逻辑加(或) SAR 算术右移 XOR 异或 循环移位 TEST 测试 ROL 循环左移 ROR 循环右移 RCL 通过进位的循环左移 RCR 通过进位的循环右移 3

  4. §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

  5. §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

  6. §3-3逻辑运算和移位指令 ⑷ XOR异或操作指令(Exclusive OR) 指令格式:XOR 目的,源 【8086的指令系统】 指令功能:目的  目的 ∨ 源 主要用于使操作数的某些位保留(和“0”相异或),而使 某些位取反(和“1”相异或) ⑸ TEST测试指令(Test) 指令格式:TEST 目的,源 指令功能:目的∧源 逻辑与操作,并修改标志位,但不回送结果,两个操作数都不变。 常用于在那些要检测某些条件是否满足,但又不希望改变原有操 作数的情况下。紧跟在这条指令后面的往往是一条条件转移指令, 根据测试结果产生分支,转向不同的处理程序。 6

  7. §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

  8. §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

  9. §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

  10. §3-3逻辑运算和移位指令 【8086的指令系统】 注意: ▲移动一次,相当于将目的操作数乘以2; ▲计数值就是所要移位的次数。 若移位一次,直接将计数值置1; 移位次数大于1,将移位次数送进CL,再把CL放在计数值位置上。 ▲对标志位的影响: 移位次数为1时,若移位后最高位的值被改变,OF置1,否则OF清0。 多次移位时,OF的值不确定。 不论移多少次,CF总是等于目的操作数最后被移出去的值。SF和 ZF 将 根据指令执行后目的操作数的状态来决定,PF只有当目的操作数在AL 中时才有效,AF不定。 10

  11. §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

  12. §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

  13. §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

  14. §3-3逻辑运算和移位指令 循环移位指令操作示意图 【8086的指令系统】 ROL 循环左移 ROR 循环右移 RCL 通过进位位的 LSB LSB LSB CF CF CF MSB MSB MSB 循环左移 CF MSB LSB RCR 通过进位位的 循环右移 14

  15. §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

  16. §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

  17. §3-3 8086的指令系统 四、字符串处理指令 相关概念 字符串:一系列存放在存储器中的字或字节数据,不管 它们是不是ASCII码。字符串长度可达64K字节。 字符串元素:组成字符串的字节或字。每种字符串指令 对字符串元素只进行同一种操作。 字符串操作指令:对字符串进行的传送、比较、扫描、 存储及装入等5种操作。 17

  18. §3-3字符串处理指令 字符串操作指令的类型和格式 【8086的指令系统】 字节/字操作 MOVS 目的串,源串 CMPS 目的串,源串 SCAS 目的串 LODS 源串 STOS 目的串 指令名称 字符串传送 字符串比较 字符串扫描 字符串装入 字符串存储 字节操作 MOVSB CMPSB SCASB LODSB STOSB 字操作 MOVSW CMPSW SCASW LODSW STOSW 说明: 每种指令都有3种格式。有两种方法用以说明是字节操作还是字操作。 方法一:用指令中的源串和目的串名(即操作数)来表明是字节还是字; 方法二: 在指令助记符后加B说明是字节,加W说明是字操作。 18

  19. §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

  20. §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

  21. §3-3字符串处理指令 【8086的指令系统】 1.MOVS字符串传送指令(Move String) 指令格式:MOVS 目的串,源串 指令功能:SI作指针的源串中的一个字节或字  DI作指针的目的串; 自动修改指针SI和DI。 指令应用: ▲解决MOV指令不能直接在存储单元间进行数据传送的问题。 ▲若使用重复前缀,还可以利用一条指令传送一批数据。 例 要求把数据段中以SRC_MESS为偏移地址的一串字符“HELLO!”,传 送到附加段中以NEW_LOC开始的单元中。 21

  22. §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

  23. §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

  24. §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

  25. §3-3字符串处理指令 【8086的指令系统】 3. SCAS字符串扫描指令(Scan String) 指令格式:SCAS 目的串 指令功能:AL/AX(字节/字操作)内容减去ES:DI中的串元素,结果反映在标志位 上,源操作数不变,操作后目的串指针会自动修改,指向下一个待搜 索的串元素。 指令应用: ▲ 利用SCAS指令,可在内存中搜索关键字。指令执行前,必须事先将关键字 存在AL(字节)或AX(字)中,才能用SCAS指令进行搜索。 ▲ SCAS指令可以加重复前缀。 25

  26. §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

  27. §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

  28. §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

  29. §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

  30. 结 1.重点 寻址方式、指令系统 2.难点 指令的正确应用 3.作业 30

More Related