微机原理与应用 第3章 8086、8088指令系统
- 格式:doc
- 大小:329.00 KB
- 文档页数:28
微机原理及应⽤(陈继红、徐晨)课后习题答案微机原理及应⽤(陈继红、徐晨)课后习题答案第三章8086/8088指令系统和寻址⽅式习题答案(部分)3.1总结计算机中⼗进制、⼆进制、⼋进制及⼗六进制数的书写形式。
123D、0AFH、77Q、1001110B分别表⽰什么计数制的数?答案:123D、0AFH、77Q、1001110B分别表⽰⼗进制、⼗六进制、⼋进制、⼆进制。
3.2字长为8位、16位⼆进制数的原码、补码表⽰的最⼤数和最⼩数分别是什么?答案:8位原码表⽰的最⼤数:(27-1)、8位补码表⽰的最⼤数:(27-1)、8位原码表⽰的最⼩数:-(27-1)、8位补码表⽰的最⼩数-27。
16最⼩数:-215。
3.3答案:7DH。
(2)255(3)7248H。
(4)509013E2H。
3.4答案:240D0F0H。
128D80H。
(3)11111111⼗进制数:255D;⼗六进制数:0FFH。
(4)01010101⼗进制数:85D;⼗六进制数:55H。
3.5把下列⽆符号⼗六进制数分别转换为⼗进制数和⼆进制数。
(1)FF(2)ABCD(3)123(4)FFFF答案:(1)FF⼗进制数:255D;⼆进制数;11111111B。
1010101111001101B。
(3)123⼗进制数:291D;⼆进制数;000100100011B。
(4)FFFF⼗进制数:65535D;⼆进制数;1111111111111111B。
3.6分别⽤8位⼆进制数和16位⼆进制数写出下列⼗进制数的原码和补码。
(1)16(2)-16(3)+0(4)-0(5)127(6)-128(7)121(8)-9 答案:(1)16800010000(2)-16800010000(3)+0800000000(4)-0800000000(5)127801111111(6)-128810000000(7)1218:01111001;16位⼆进制数原码:0000000001111001补码:0000000001111001。
第3章 8086/8088指令系统寻址方式寻址方式:包含数据寻址方式和转移地址寻址方式。
这里指数据寻址方式。
它是指取得指令操作数地址的方式。
(1)立即寻址方式(2)直接寻址方式(3)寄存器寻址方式(4)寄存器间接寻址方式(5)寄存器相对寻址方式(6)基址变址寻址方式(7)相对基址变址寻址方式寻址方式:包含数据寻址方式和转移地址寻址方式。
这里指数据寻址方式。
它是指取得指令操作数地址的方式。
(1)立即寻址方式(2)直接寻址方式(3)寄存器寻址方式(4)寄存器间接寻址方式(5)寄存器相对寻址方式(6)基址变址寻址方式(7)相对基址变址寻址方式1 寄存器间接寻址方式微机原理寄存器间接寻址:操作数的有效地址是寄存器的内容,结合对应段寄存器的内容计算出操作数的物理地址,存储器中对应物理地址的内容即是操作数。
1 寄存器间接寻址方式微机原理例: MOV AX,[BX]假设DS寄存器的内容为 1000HBX寄存器的内容为 3600H那么源操作数的存储器的物理地址为1000H*16+3600H=13600H由于是16位的操作数,所以从13600H、13601H 2个单元读出内容送至AX。
1 寄存器间接寻址方式微机原理2 寄存器相对寻址方式微机原理寄存器相对寻址:操作数的有效地址由SI、DI、BX或BP之一的内容,加上指令中8位或16位相对地址构成。
例:MOV AX,[BX+0D8H]假设DS寄存器的内容为 6000HBX寄存器的内容为 4500H那么源操作数的存储器的物理地址为6000H*16+4500H+0D8H=645D8H有效地址2 寄存器相对寻址方式微机原理基址变址寻址:操作数的有效地址等于一个基址寄存器的内容和一个变址寄存器的内容之和。
基址寄存器:BX、BP 变址寄存器:SI 、DI例: MOV AL,[BX+DI]可以记成 MOV AL,[BX][DI]或记成 MOV AL ,[BX]+[DI]例:MOV AL,[BX] [DI]假设DS寄存器的内容为 6000HBX寄存器的内容为 4500HDI寄存器的内容为 1600H那么源操作数的存储器的物理地址为6000H*16+4500H+1600H=60000H+5B00H=65B00H有效地址3 基址变址寻址方式微机原理相对基址变址寻址:操作数的有效地址等于一个基址寄存器的内容、一个变址寄存器的内容以及一个偏移量之和。
微机原理及应⽤习题库与答案微机原理及应⽤习题库与答案习题与练习题1第1章绪论1.计算机分那⼏类?各有什么特点?答:传统上分为三类:⼤型主机、⼩型机、微型机。
⼤型主机⼀般为⾼性能的并⾏处理系统,存储容量⼤,事物处理能⼒强,可为众多⽤户提供服务。
⼩型机具有⼀定的数据处理能⼒,提供⼀定⽤户规模的信息服务,作为部门的信息服务中⼼。
微型机⼀般指在办公室或家庭的桌⾯或可移动的计算系统,体积⼩、价格低、具有⼯业化标准体系结构,兼容性好。
2.简述微处理器、微计算机及微计算机系统三个术语的内涵。
答:微处理器是微计算机系统的核⼼硬件部件,对系统的性能起决定性的影响。
微计算机包括微处理器、存储器、I/O接⼝电路及系统总线。
微计算机系统是在微计算机的基础上配上相应的外部设备和各种软件,形成⼀个完整的、独⽴的信息处理系统。
3.80X86微处理器有⼏代?各代的名称是什么?答:从体系结构上可分为3代:← 8080/8085:8位机。
↑ 8086/8088/80286:16位机。
→ 80386/80486:32位机。
第2章微处理器结构及微计算机的组成1.8086是多少位的微处理器?为什么?答:8086是16位的微处理器,其内部数据通路为16位,对外的数据总线也是16位。
2.EU与BIU各⾃的功能是什么?如何协同⼯作?答:EU是执⾏部件,主要的功能是执⾏指令。
BIU是总线接⼝部件,与⽚外存储器及I/O接⼝电路传输数据。
EU经过BIU进⾏⽚外操作数的访问,BIU为EU提供将要执⾏的指令。
EU与BIU可分别独⽴⼯作,当EU不需BIU提供服务时,BIU可进⾏填充指令队列的操作。
3.8086/8088与其前⼀代微处理器8085相⽐,内部操作有什么改进?答:8085为8位机,在执⾏指令过程中,取指令与执⾏执令都是串⾏的。
8086/8088由于内部有EU和BIU两个功能部件,可重叠操作,提⾼了处理器的性能。
4.8086/8088微处理器内部有那些寄存器,它们的主要作⽤是什么?答:执⾏部件有8个16位寄存器,AX、BX、CX、DX、SP、BP、DI、SI。
第3章8086/8088指令系统与寻址方式习题3.3 8086系统中,设DS=1000H,ES=2000H,SS=1200H,BX=0300H,SI=0200H,BP=0100H,VAR的偏移量为0600H,请指出下列指令的目标操作数的寻址方式,若目标操作数为存储器操作数,计算它们的物理地址。
(1)MOV BX,12 ;目标操作数为寄存器寻址(2)MOV [BX],12 ;目标操作数为寄存器间址 PA=10300H(3)MOV ES:[SI],AX ;目标操作数为寄存器间址 PA=20200H(4)MOV VAR,8 ;目标操作数为存储器直接寻址 PA=10600H(5)MOV [BX][SI],AX ;目标操作数为基址加变址寻址 PA=10500H(6)MOV 6[BP][SI],AL ;目标操作数为相对的基址加变址寻址 PA=12306H(7)MOV [1000H],DX ;目标操作数为存储器直接寻址 PA=11000H(8)MOV 6[BX],CX ;目标操作数为寄存器相对寻址 PA=10306H(9)MOV VAR+5,AX ;目标操作数为存储器直接寻址 PA=10605H3.4 下面这些指令中哪些是正确的?那些是错误的?如果是错误的,请说明原因。
(1)XCHG CS,AX ;错,CS不能参与交换(2)MOV [BX],[1000] ;错,存储器之不能交换(3)XCHG BX,IP ;错,IP不能参与交换(4)PUSH CS(5)POP CS ;错,不能将数据弹到CS中(6)IN BX,DX ;输入/输出只能通过AL/AX(7)MOV BYTE[BX],1000 ;1000大于255,不能装入字节单元(8)MOV CS,[1000] ;CS不能作为目标寄存器(9)MOV AX,[SI][DI] ;SI、DI不能成为基址加变址3.7 设当前 SS=2010H,SP=FE00H,BX=3457H,计算当前栈顶的地址为多少?当执行 PUSH BX 指令后,栈顶地址和栈顶2个字节的内容分别是什么?当前栈顶的地址=2FF00H当执行PUSH BX 指令后,栈顶地址=2FEFEH(2FEFEH)=57H(2FEFFH)=34H3.8 设DX=78C5H,CL=5,CF=1,确定下列各条指令执行后,DX和CF中的值。
第三章 8086/8088 指令系统(instruction system )§3.1 指令格式和寻址方式(instruction format & addressing mode ) 一.指令格式指令:规定计算机进行某种操作的命令 格式:1~2 Byte1~4 Byte字长为1~6字节单字节指令:操作码和操作数合一字节或无操作数INCCX ;机器码41H 即01000001(格式 )代码 000 001 010 011 100 101 110 111 reg AX CX DX BX SPBPSIDI多字节指令:操作码占1~2字节MOV AX ,[0700H];机器码 A1 00 07(格式 ) (w=1取AX ,w=0取AL ) 二.寻址方式寻址:指令寻找操作数 可采用六种方式寻址 1.立即数寻址指令的一个操作数是立即数(常数) MOV AX ,200;AX ←200立即数范围:8位n = 00 ~ FFH ,16位nn = 0000 ~ FFFFH 2.寄存器寻址指令中的寄存器存放了操作数 ADD CX ,BX ;CX ←CX+BX DEC CX ;CX ←CX -1 3.寄存器间接寻址指令中寄存器存放了操作数的地址,通常使用的寄存器是BX 、BP 、SI 、DI ,且用方括号括起来MOV AX ,[BX];AX ←[BX] 设BX = 0100H ,指令执行后 0100H 单元数送AL 0101H 单元数送AH4.直接寻址指令中指明操作数地址,它是数据段DS 的偏移地址 ADD AX ,[0200H];AX ←AX+[0200H] 设DS = 1000H ,指令执行后10200H 和10201H 两单元组成的16位数(低字节在先)与AX相加并存于AX 中5.变址寻址(直接变址寻址,或寄存器相对寻址)DS:0100 DS:0101指令中指定的变址寄存器(SI、DI)的内容加上位移量作为操作数地址MOV AX,[DI+4];AX←[DI+4]基址寻址,与变址寻址一样,只是指令中使用基址寄存器(BX、BP)MOV AX,[BX+6];AX←[BX+6]BX对应的当前段是DS,BP对应SSIBM汇编允许三种形式指定基址寻址标准形式MOV AX,[BX]+6先写位移量MOV AX,6[BX]位移量写在括号内MOV AX,[BX+6]6.基址变址寻址(有位移量也叫基址变址相对寻址)操作数的地址由基址寄存器、变址寄存器的内容和位移量三者相加而得(也可没有位移量)MOV AX,[BP+SI+6];AX←[BP+SI+6]∙ 8086/8088寻址方式有的分得更细,还有隐含、相对、字符串、I/O 端口寻址等等∙当前段以外的寻址一字节段超越前缀:SEGSEG 00 01 10 11ES CS SS DSMOV [BX],AX 的当前段(隐含的段)为DS,现要在当前附加段寻址,指令应为MOV ES:[BX],AX汇编后段前缀机器码在前,即26 89 07,(SEG=00为ES,故得00100110)∙有效地址和物理地址三.指令分类8086/8088的99条指令分为六类1.数据传送类142.算术运算类203.逻辑运算类124.字符串操作类135.控制转移类(转移、调用和返回、迭代控制)286.处理机控制类12§3.2 数据传送指令(data transfer)一.通用数据传送1.MOV把一个字节或字从源操作数传送到目的操作数中格式:MOV dst ,src有:R/M ↔ reg ,R/M ← I ,SEG ↔ R/MMOV AX,TABLE;AX ← TABLEMOV CL,80H ;CL ← 80HMOV BETA,9BH;BETA← 9BHMOV AX,ES ;AX ← ES禁止:CS ← R/M,CS ← I,IP← R/M,IP← I例:将BX内容送内存8A2EHMOV [8A2EH],BX设DS=2000H,则物理地址为2000H⨯16+8A2EH=28A2EH指令执行后,BL→[28A2EH],BH→ [28A2FH] 2.PUSH把字压入堆栈格式:PUSH src有:ST←R/M,ST←SEG (ST—栈顶,stack top)PUSH DS ;[ST] ←DSPUSH ALPHA;[ST] ←ALPHA操作过程:SP←SP-2,[SP+1,SP] ←src 例:设SS=0200H,SP=0008H,将AX、BX程序段为PUSH AXPUSH BXHL T执行前栈顶SS:SP=02008H执行后02004H3.POP把字弹出堆栈格式:POP dst有:R/M ← ST,SEG ← STPOP ALPHA;ALPHA← [ST]POP DS ;DS ← [ST]操作过程:dst ← [SP+1,SP] ,SP←SP+2例:设SS=0200H,SP=0004H,将当前栈顶内容传送至ES指令为POP ES执行前栈顶为SS:SP=02004H执行后ES=1020H栈顶为02006H4.XCHG将源操作数和目的操作数(字节或字)互相交换格式:XCHG dst,srcXCHG CL,BETA;CL BETAXCHG AX,DX ;AX DX(XCHG AX,DX也可用PUSH AX,PUSH DX,POP AX,POP DX达到)5.XLA T字节翻译,也叫查表转换.将表中的一个字节取至累加器AL中.表的起始地址预置在BX中,AL原来的内容为表的偏移地址(相对于BX)格式:XLA T ;AL ← [BX+AL]例:电话通讯中的五中取二码存于0600H~0609H单元,请取出十进制数6的五中取二码MOV BX,0600H ;表首地址MOV AL,06H ;表的第7个元素XLA T ;查表转换HL T ;暂停02004H02006H02008H02004H02005H02006H二.输入/输出数据传送1.IN将输入设备的一个端口的数据(字或字节)送到累加器直接端口寻址:用8位立即数作为端口地址,范围0~255间接端口寻址:用寄存器DX的内容作为端口地址,范围0~65535 格式:IN A cc,portIN AX,70H ;AL ← [70H],AH ← [71H]IN AL,70H ;AL ← [70H]IN AX,DX ;AL ← [DX],AH ← [DX+1]IN AL,DX ;AL ← [DX]例:设DX=7C1AH,则执行IN AX,DX后结果如下2.OUT将累加器的内容(字节或字)送到输出设备的一个端口直接端口寻址:用8位立即数作为端口地址,范围0~255间接端口寻址:用寄存器DX的内容作为端口地址,范围0~65535 格式:OUT port ,A ccOUT 70H,AX ;[70H] ← AL,[71H] ← AHOUT DX ,AL ;[DX] ← AL三.目的地址传送这些指令规定源操作数来自存储器,目的操作数来自寄存器指令仅对变量的地址进行处理,不处理变量的内容1.LEA装入有效地址格式:LEA dst ,src ;reg ← mem16LEA BX,V ARI ;BX ← EA(相当于MOV BX,OFFSET V ARI)LEA DX,[SI] ;DX ← EA(相当于MOV DX,SI)例:若DI=005BH,BX=3F00H,LEA AX,[BX+DI]后,AX=3F5BH注意:若执行MOV AX,[BX+DI],结果是AX=[3F5BH] 2.LDS把指示器的内容(即指针变量)装入DS中格式:LDS dst ,src ;reg ← [EA],DS ← [EA+2]LDS BX,TABLE ;BX ← [EA],DS ← [EA+2] 例:设当前数据段DS=8000H,在偏移地址为0F1CH开始存放四个字节B2 01 20 3F,若执行LDS BX,[0F1CH]MOV AX,[BX]第一条指令得:BX=01B2H,DS=3F20H数据段地址产生转换,使3F20H成为当前段,相当于执行MOV BX,[0F1CH]MOV DS,[0F1CH+2]第二条指令则从DS:BX=3F200H+01B2H=3F3B2H单元取数送AX80F1CH3F3B2HAX3.LES把指示器的内容装入ES中格式:LES dst ,srcLES BX,[DI] ;BX ← [EA],ES ← [EA+2]四.状态标志位传送1.LAHF把状态标志寄存器的低8位装到AH中格式:LAHF ;AH ← FlagsAH2.SAHF把AH的内容装入标志寄存器低8位,标志寄存器高8位不变格式:SAHF ;Flags ← AH3.PUSHF把状态标志压入堆栈格式:PUSHF ;ST← Flags操作过程:SP←SP-2,[SP+1,SP] ← Flags4.POPF把状态标志弹出堆栈格式:POPF ;Flags ← ST操作过程:Flags ← [SP+1,SP],SP← SP+2说明:1.数据传送指令执行后源操作数不会改变(XCHG除外)2.大多数数据传送指令不影响标志寄存器,只有SAHF和POPF对标志有影响O D I T S Z A P CSAHF ····+ + + + +POPF + + + + + + + + +§3.3 算术运算指令(arithmeti c operation)一.加法运算1.ADD将两个操作数相加并把和送目的操作数格式:ADD dst,src有:R/M ← reg + R/M,R/M ← R/M + IADD DX,AX ;DX ← DX + AXADD BETA,CL ;BETA← BETA + CLADD SI,98BFH ;SI ← SI + 98BFHADD TAB,1234H ;TAB ← TAB + 1234H2.ADC带进位加,将两个操作数(字节或字)及进位标志相加,结果送目的操作数格式:ADC dst,src有:R/M ← reg + R/M + CF,R/M ← R/M + I + CF例:将存储单元1240H~1242H的24位数与1243H~1245H的24位数相加,结果送1240H~1242H单元.字节按先低后高顺序存放MOV AL,[1243H]ADD [1240H],AL [1242H] [1241H] [1240H]MOV AX,[1244H] + [1245H] [1244H] [1243H]ADC [1241H],AX [1242H] [1241H] [1240H]HL T3.INC增量,将操作数(字节或字)加1并回送格式:INC dstINC CX ;CX←CX+1INC BETA;BETA←BETA+1(BETA是个存储器操作数,可用BYTE PTR或WORD PTR临时指定其类型)二.减法运算1.SUB将左操作数减去右操作数并回送到左操作数格式:SUB dst,src有:reg ← reg - R/M,M←M –reg,R/M ← R/M - ISUB SI,BX ;SI ←SI-BXSUB BETA,DL ;BETA← BETA-DL2.SBB带借位减,将左操作数减去右操作数和进位标志,结果回送到左操作数格式:SBB dst,src有:R/M←reg -R/M-CF,M←M–reg -CF,R/M←R/M–I -CF SBB AX,BX ;AX ← AX - BX - CFSBB AX,1FF0H;AX ← AX - 1FF0H - CF例:将存放在0540H~0543H单元的32位数减去0544H~0547H 单元的32位数,结果放在0540H~0543H单元,按先低后高顺序MOV AX,[0544H]SUB [0540H],AX [0543H] [0542H] [0541H] [0540H]MOV AX,[0546H] -[0547H] [0546H] [0545H] [0544H]SBB [0542H],AX [0543H] [0542H] [0541H] [0540H]HLT3.DEC减量,操作数减1并回送格式:DEC dstDEC BL ;BL ← BL - 1DEC TABLE ;TABLE ← TABLE - 14.NEG求补,对操作数(字节或字)求补码(连符号位)格式:NEG dst ;dst ← 0 - dst5.CMP比较,将目的操作数减去源操作数,不回送结果比较后两操作数不变,仅影响标志位格式:CMP dst,src ;dst - src有:R/M - reg,R/M - ICMP SI,BX ;SI - BXCMP BETA,8FH ;BETA– 8FH·无符号数A与B比较,即A-B,有当ZF=1,A=B (ZF=1,CF=0)CF=0,A>B (ZF=0,CF=0)A≥ B(CF=0)CF=1,A<B (ZF=0,CF=1)·带符号数A与B比较,即A-B①当A=3AH,B=E3H00111010 A>B+00011101——[E3H]变补SF=0,OF=0(C Y7=0,C Y6=0)01010111②当A=E3H,B=3AH11100011 A<B+11000110 SF=1,OF=0(C Y7=1,C Y6=1)110101001③当A=3AH,B=9DH00111010 A>B+01100011 SF=1,OF=1(C Y7=0,C Y6=1)10011101④当A=9DH,B=3AH10011101 A<B+11000110 SF=0,OF=1(C Y7=1,C Y6=0)101100011可见,OF=SF时,A≥B(ZF=1时,A=B)OF=SF时,A<B即:比较结果为正无溢出,结果为负有溢出A≥B比较结果为负无溢出,结果为正有溢出A<B另一种判据是:A7⊕B7=CF时,A≥BA7⊕B7=CF时,A<B即:同号比较无进位,异号比较有进位A≥B同号比较有进位,异号比较无进位A<B三.乘法运算将两个8位或16位数相乘乘法运算应区分无符号数和带符号数,例:FFH⨯FFH无符号数为255⨯255=65025带符号数为(-1)⨯(-1)=11.MUL不带符号的字节或字乘法运算,乘数不能是立即数相乘结果积的高半部为0则CF和OF复位,否则CF和OF置位,表示高半部积有效格式:MUL src ;dst ← Acc ⨯ srcMUL BL ;AX ← AL ⨯ BLMUL BX ;DX:AX ← AX ⨯ BXMUL BETA;AX ← AL ⨯ BETA(这里BETA定义为字节)2.IMUL带符号乘,也叫整数乘,对两个带符号数(字节或字)进行乘法运算相乘结果积的高半部为低半部的符号扩展则CF和OF复位,否则CF和OF置位,表示高半部积有效格式:IMUL src ;dst ← Acc ⨯ srcIMUL CL ;AX ← AL ⨯ CLIMUL TABLE ;DX:AX ← AX ⨯ TABLE四.除法运算1.DIV不带符号的字节或字除法运算,除数不能是立即数如果除数为0,或运算结果商超出范围则产生除法错误中断,且商和余数不确定格式:DIV src ;AL← AX/src,AH ← REM(8位)或AX ← DX:AX/src,DX ← REM(16位)DIV BL ;AL ← AX/BL,AH ← REMDIV BX ;AX ← DX:AX/BX,DX ← REM例:751BH ÷ 79H → CL(商)MOV AX,751BH ;取被除数MOV BL,79H ;取除数DIV BL ;相除MOV CL,AL ;送商到CLHLT2.IDIV带符号除,也叫整数除,执行带符号数(字节或字)除法运算如果除数为0,或运算结果商超出范围则产生除法错误中断,且商和余数不确定运算后商的范围:字节为+127(7FH)~ -127(81H)字为+32767(7FFFH)~ -32767(8001H)·整数除规定:余数的符号与被除数相同,当产生非整数商时,采用舍尾取整使商成为整数例:手算(-11)÷(-3)=11÷3 =3余2计算机运算结果为3余(-2),而(-11)÷3 = -3余(-2)格式:IDIV src ;AL← AX/src,AH ← REM(8位)或AX ← DX:AX/src,DX ← REM(16位)IDIV BX ;AX ← DX:AX/BX,DX ← REMIDIV BETA;AL ← AX/BETA,AH ← REM 3.CBW将字节转换为字操作过程:若A7=0则AH ← 0 ,A7=1则AH ← FFH格式:CBW ;AH = FFH ⨯ A7,AL不变4.CWD将字转换为双字操作过程:若A15=0则DX ← 0 ,A15=1则DX ← FFFFH 格式:CWD ;DX = FFFFH ⨯ A15,AX不变例:设BH=FBH(-5),BL=FEH(-2),CH=ECH(-20),CL=05 计算(BH ⨯ BL)+(CH/CL)→ AXMOV AL,BH ;AX=⨯⨯FBHIMUL BL ;AX=000AH=-5⨯(-2)MOV DX,AX ;结果暂存DXMOV AL,CH ;AX=00ECH(-20)CBW ;AX=FFECH,扩展为双倍字节IDIV CL ;AX=00FCH(-4)CBW ;AX=FFFCHADD AX,DX ;AX=0006H=+6HL T五.十进制和ASCII调整压缩BCD数:又叫组合BCD数,一个字节放两位BCD数,范围0~99,例:85=10000101非压缩BCD数:又叫分离BCD数,一个字节只在低4位放一位BCD数,范围0~9,例:7=00000111压缩和非压缩BCD数都是无符号数(一)十进制调整1.DAA(decimal adjust for addition)加法十进制调整格式:DAA编程时,DAA紧跟在ADD或ADC之后例:将两个BCD数29H和57H相加,结果送0A10H单元MOV AL,29H 00101001ADD AL,57H + 01010111DAA 10000000MOV [0A10H],AL + 0110HL T 10000110 —86 2.DAS(decimal adjust for subtraction)减法十进制调整格式:DAS编程时,DAS紧跟在SUB或SBB之后例:53-28=25 01010011MOV AL,53H + 11011000 [-28]补SUB AL,28H 100101011 CF=C Y7=0,AF=C Y3=1DAS + 11111010 [-06]补HL T 100100101(二)非压缩BCD(ASCII)调整1.AAA(ASCII adjust for addition)加法ASCII调整相加结果出现半进位或AL低四位非法,则作加6调整,并在AH中加1,AL高四位清0格式:AAA编程时,AAA紧跟在ADD之后2.AAS(ASCII adjust for subtraction)减法ASCII调整相减结果出现半借位或AL低四位非法,则作减6调整,并将AH减1,AL高四位清0格式:AAS编程时,AAS紧跟在SUB之后3.AAM(ASCII adjust for multiply)乘法ASCII调整格式:AAM ;AH←AL/0AH,AL←AL%0AH(余数,%表示取模)编程时,AAM紧跟在MUL之后·注意:若数字为ASCII码,其高4位为3H,运算前应先清0,运算、调整后再恢复例:4 ⨯ 9 → CXMOV AL,04H ;AL=0000 0100MOV BL,09H ;BL=0000 1001MUL BL ;AX=0000 0000 0010 0100AAM ;AH=0000 0011(AL/10),AL=0000 0110(AL/10的余数)MOV CX,AX ;CX=0000 0011 0000 0110HLT4.AAD(ASCII adjust for division)除法ASCII调整格式:AAD ;AL←AH⨯0AH+AL,AH←0编程时,AAD设置在DIV之前例:非压缩BCD数45÷7→14B0H单元MOV AX,0405H ;AX=0000 0100 0000 0101MOV BL,07H ;BL=0000 0111AAD ;AH=0000 0000,AL=0010 1101(AX=002DH)DIV BL ;AH=0000 0011,AL=0000 0110(AX=0306H)MOV [14B0H],AL ;[14B0H]←商HLT·注意:①对非压缩BCD数的加、减、乘调整在运算之后,对除法调整在运算之前②非压缩BCD数的乘除运算,数的高4位必须为0,加减法无此要求⨯表示不确定§3.4 逻辑运算指令(logic operation)一.逻辑运算1.NOT求反,也叫非,将字节或字操作数求反并回送结果格式:NOT dst ;dst ← FFH-dst(8位)或dst ← FFFFH-dst(16位)NOT AX ;AX ← FFFFH - AXNOT BETA;BETA← FFH - BETA2.AND逻辑与,两操作数(字节或字)相与并将结果送到目的操作数格式:AND dst,src ;dst ← dst ∧ src(与,∧,&)有:R/M ← R/M ∧ reg ,R/M ← R/M ∧ IAND AX,BX ;AX ← AX ∧ BXAND ALPHA+2,SI ;ALPHA+2 ←(ALPHA+2)∧ SIAND AL,23H ;AL ← AL ∧ 23HAND用途:①清进位标志,如AND AL,AL使CF=0,AL不变②位屏蔽,如AND AL,7FH使字节最高位变0③测位,如AND AL,08H若ZF=1则A3=0否则A3=13.OR逻辑或,两操作数(字节或字)相或并将结果送到目的操作数格式:OR dst,src ;dst ← dst ∨ src(或,∨,|)有:R/M ← R/M ∨ reg ,R/M ← R/M ∨ IOR DL,CL;DL ← DL ∨ CLOR BETA,BL ;BETA← BETA∨ BLOR AX,1234H ;AX ← AX ∨ 1234HOR用途:①清进位标志,如OR AL,AL使CF=0,AL不变②组合信息或置位,如OR AL,01使AL最低位为14.XOR逻辑异或,两操作数(字节或字)相异或并将结果送到目的操作数格式:XOR dst,src ;dst ← dst src(异或,,‖)有:R/M ← R/M reg ,R/M ← R/M IXOR CX,SI ;CX ← CX SIXOR BL,BYTE+1 ;BL ← BL BYTE+1XOR BP,2345H ;BP ← BP 2345HXOR用途:①清进位标志,如XOR AL,AL使CF=0,AL=0②位取反,如XOR AL,03H使AL低二位取反③其他,如XOR AL,BL比较AL和BL,若ZF=1则AL=BLAND、OR、XOR特点①都可清进位标志,AND AL,AL和OR AL,AL不影响AL,XOR AL,AL清AL②AND对某些位置0,OR置1,XOR取反例:MOV AL,F0H ;AL ← 11110000AND AL,9FH ;AL ← 10010000使A5、A6=0OR AL,02H ;AL ← 10010010使A1=1XOR AL,80H ;AL ← 00010010使A7← A75.TEST测试,两操作数(字节或字)相与,但不回送结果格式:TEST dst,src ;dst ∧ src有:R/M ∧ reg ,R/M ∧ ITEST DL,04H;DL ∧ 00000100,如果ZF=1则D2=0,否则D2=1二.移位对寄存器或存储器移位1.SHL/SAL(shift logi cal/arithmetic left)SHL为逻辑左移,SAL为算术左移.操作数(B/W)各位均左移一位,最高有效位MSB(most significant bit)移入标志位CF,最低有效位LSB(least significant bit)补0←←0格式:SHL/SAL dst,count ;dst左移count次(左移一次时count=1,左移多次时count=CL)SHL CL,1 ;CL左移一次SHL AX,CL ;AX左移,次数由CL决定SHL MEM,CL ;MEM左移,次数由CL决定·左移一次相当于把原来的无符号数乘以2BL=00010111B=23D,左移一次后BL=00101110B=46D例:将0640H~0641H单元的16位无符号数乘以64,设乘积不大于65535因64=26,即可将16位无符号数左移6次而得乘积MOV CL,06HSHL WORD PTR [0640H],CLHL T2.SHR(shift logical right)逻辑右移,将目的操作数(B/W)右移0 →→格式:SHR dst,count ;dst右移count次SHR AX,1 ;AX右移一次SHR MEM,CL ;MEM右移,次数由CL决定·右移一次相当于把原来的无符号数除以2DX=0000 0001 0001 0110B=278D,右移一次后DX=0000 0000 1000 1011B=139D3.SAR(shift arithmeti c right)算术右移,将目的操作数(B/W)右移,最低有效位移入CF,最高有效位不变→格式:SAR dst,count ;dst右移count次SAR影响CF、SF、ZF、PF标志·算术右移一次相当于把原来的符号数除以2AL=10001001B(补码,原码为11110111B即-119)执行SAR AL,1后AL=11000100B(补码,原码为10111100B即-60)三.循环移位将目的操作数的首尾闭合进行左移或右移1.ROL(rotate left)循环左移,也叫小循环左移.将目的操作数(B/W)循环左移格式:ROL dst,count ;dst循环左移count次ROL SI,1 ;SI循环左移1次ROL MEM,CL;MEM循环左移CL次BL=01010011,执行ROL BL,1后BL=10100110,CF=0 2.ROR(rotate right)循环右移,也叫小循环右移.将目的操作数(B/W)循环右移格式:ROR dst,count ;dst循环右移count次3.RCL(rotate left through carry)带进位标志循环左移,也叫大循环左移.将目的操作数(B/W)连同CF循环左移格式:RCL dst,count ;dst带CF循环左移count次RCL AL,1 ;AL带CF循环左移1次RCL WORD+A,CL;WORD+A带CF循环左移CL次AL=00101110,CF=1 执行RCL AL,1后AL=01011101,CF=04.RCR(rotate right through carry)带进位标志循环右移,也叫大循环右移.将目的操作数(B/W)连同CF循环右移格式:RCR dst,count ;dst带CF循环右移count次·使用移位/循环移位应注意:i.对存储器操作数应指明数据类型ii.多次移位应先设CL·ROL、ROR循环8次(字16次)复原,RCL、RCR循环9次(字17次)复原·移位指令常用于检查操作数内容,如最高位移入CF检查正负,最低位移入CF检查奇数或偶数注:移位和循环移位对标志位影响指仅移位一次§3.5 字符串操作指令(string manipulation)字符串:位于存储器中的由字节或字组成的一组数据或字符序列字符串最长为64K,组成字符串的字节或字叫字符串元素字节字符串简称字节串,字字符串简称字串,字符串操作简称串操作一.变址寄存器、计数器和标志位的设置1.变址寄存器的设置规定:由DS:SI给出源字符串元素地址由ES:DI给出目的字符串元素地址若串操作在同一段中进行,则使DS=ES2.计数器的设置在串操作指令前,在CX中设置重复次数3.方向标志DF的设置方向标志DF=0时,串操作从低地址向高地址进行方向标志DF=1时,串操作从高地址向低地址进行(STD使DF=1,CLD使DF=0)对字节串操作,DF=0时SI和DI每次加1,DF=1时则减1对字串操作,DF=0时SI和DI每次加2,DF=1时则减2二.REP指令重复前缀,置于串操作指令之前,重复执行其后的串操作指令直至CX=0格式例:REP MOVSB;重复执行MOVSB,当CX=0停止重复REPE CMPS;重复执行CMPS,当CX=0或ZF=0停止重复REPZ SCAS;重复执行SCAS,当CX=0或ZF=0停止重复REPNE CMPS;重复执行CMPS,当CX=0或ZF=1停止重复REPNZ SCAS;重复执行SCAS,当CX=0或ZF=1停止重复三.MOVS字节串或字串传送,将在DS:SI的字节或字传送到ES:DI中,MOVS与REP联用实现串传送重复操作格式:MOVS dst,src ;[ES:DI] ← [DS:SI],SI ← SI ± 1,DI ← DI ± 1(字节)[ES:DI] ← [DS:SI],SI ← SI ± 2,DI ← DI ± 2(字)MOVSB ;[ES:DI] ← [DS:SI],SI ← SI ± 1,DI ← DI ± 1MOVSW ;[ES:DI] ← [DS:SI],SI ← SI ± 2,DI ← DI ± 2 例:把一数据块从地址1传送到地址2MOV SI,OFFSET STR1;地址1MOV DI,OFFSET STR2;地址2MOV CX,LENGTH STR1;计数CLDREP MOVS STR2,STR1;传送,或NEXT:MOVS STR2,STR1LOOP NEXT若用单次传送指令,程序如下:MOV SI,OFFSET STR1;地址1MOV DI,OFFSET STR2;地址2MOV CX,LENGTH STR1;计数NEXT:MOV AL,[SI] NEXT:MOV AX,[SI] MOV [DI],AL MOV [DI],AXINC SI 对字操作INC SIINC DI INC SILOOP NEXT INC DIINC DI·数据块传送时,若源地址和目的地址有重迭,应特别注意置例:DS=ES,源地址2000H~2005H,目的地址2004H~2009H,则应从高地址先处理即设置DF=1,SI=2005H,DI=2009H,CX=06H(字节串)DF=1,SI=2004H,DI=2008H,CX=03H(字串)四.CMPS字节串或字串比较,将DS:SI的源操作数减去ES:DI的目的操作数,执行后不回送结果格式:CMPS src,dst ;[DS:SI] - [ES:DI],SI ← SI ± 1,DI ← DI ± 1(字节)[DS:SI] - [ES:DI],SI ← SI ± 2,DI ← DI ± 2(字)CMPSB ;[DS:SI] - [ES:DI],SI ← SI ± 1,DI ← DI ± 1CMPSW ;[DS:SI] - [ES:DI],SI ← SI ± 2,DI ← DI ± 2 与REPE/REPZ联用时,若CX=0或ZF=0停止与REPNE/REPNZ联用时,若CX=0或ZF=1停止例:在0700H~070FH和800H~080FH单元有两组非压缩BCD数,其中有一对数对应相等,请找出它并送AL,对应地址送DX0700H 0800H0701H 0801H070FH 080FHCLD ;DF=0MOV CX,0010H ;计数16次MOV SI,0700H ;源串首址MOV DI,0800H;目的串首址REPNE CMPSB ;重复比较DEC SI ;退到相等数所在地址MOV DX,SI ;地址送DXMOV AL,[SI] ;相等数送ALHL T五.SCAS字符串搜索,将AL(对字节串)或AX(对字串)的值减去DI寻址的操作数的值,不回送结果格式:SCAS dst ;AL – [DI],DI ← DI ± 1AX – [DI],DI ← DI ± 22000H2001H2004H2005H2008H2009HSCASB ;AL – [DI],DI ← DI ± 1SCASW ;AX – [DI],DI ← DI ± 2与REPE/REPZ联用时,若CX=0或ZF=0停止与REPNE/REPNZ联用时,若CX=0或ZF=1停止六.LODS取入字符串,将SI寻址的字符串元素(B/W)传送到累加器(AL/AX)中格式:LODS src ;AL ← [SI],SI ← SI ± 1AX ← [SI],SI ← SI ± 2LODSB ;AL ← [SI],SI ← SI ± 1LODSW ;AX ← [SI],SI ← SI ± 2七.STOS存储字符串,将累加器(AL/AX)中的内容传送到DI指出的存储单元中去格式:STOS dst ;[ES:DI] ← AL,DI ← DI ± 1[ES:DI] ← AX,DI ← DI ± 2STOSB ;[ES:DI] ← AL,DI ← DI ± 1STOSW ;[ES:DI] ← AX,DI ← DI ± 2例:将0400H~04FFH单元清0CLDMOV CX,0080H;80H个字MOV DI,0400H ;首地址MOV AX,0000H;AX清0REP STOSW ;重复清0§3.6 控制转移指令(control transfer)用来改变CS 和IP 的内容,使程序执行顺序发生变化,转移指令有五类:无条件转移,调用和返回,条件转移,迭代控制,中断 一.无条件转移指令段内转移:转移目的地在当前段内,只改变IP ,不改变CS 段间转移:转移目的地在其他代码段,应改变IP 和CS 1.段内转移 (1)段内直接短转移格式:JMP target ;IP ← IP+di sp8(用符号扩展成16位) (JMP SHORT opr ;SHORT 是直接短转移的短程算符) 8位位移量是补码,范围 –128~ + 127,它是从现行指令后的指令所在地址算起的从现行指令算起则为 –126 ~ +129目的地址=源地址+2+disp (用符号扩展成16位) 或:目的地址=IP+disp (IP 是下一条指令地址)例:短转移指令JMP SHORT LAB 在2040H 处,执行后,程序转移到 目的地址=2040H+2+0005H=2047H 如果希望转移到2030H ,则disp=2030–2042=FFEE (取EE ),(上跳,负跳,地址变小)如果希望转移到20A0H ,则disp=20A0–2042=005E (取5E ),(下跳,正跳,地址变大)(2)段内直接转移格式:JMP target ;IP ← IP+di sp16(JMP NEAR PTR opr ;NEAR 是近程算符) 目的地址=源地址+3+disp跳转范围为±32K (带符号16位补码) (3)段内间接转移格式:JMP target ;IP ← EA 跳转范围为0~FFFFH JMP AX ;IP ← AX JMP [BX] ;IP ←[BX]JMP BETA-WORD ;IP ← BETA-WORD 2.段间转移 (1)段间直接转移格式:JMP target ;IP ← offset ,CS ← seg (JMP FAR PTR opr ;FAR 是远程算符) JMP 055C:0010;IP ←0010,CS ←055C (2)段间间接转移格式:JMP target ;IP ← [EA],CS ← [EA+2] JMP FAR PTR [SI] ;IP ←[SI],CS ←[SI+2]2040H2041H2042H二.调用指令和返回指令又称转子程序,CALL与RET必须成对使用1.CALL调用子程序,用以调用段内或段间子程序,有:段内直接调用段内间接调用段间直接调用段间间接调用格式:CALL target ;段内SP ← SP- 2,[SP + 1,SP] ← IP,IP ← IP + disp段间SP ← SP- 2,[SP + 1,SP] ← CS,CS ← segSP← SP- 2,[SP + 1,SP] ← IP,IP ← offset 例:CALL NEAR PTR LAB ;IP← IP + disp16CALL NEAR [DI] ;IP← [DI]CALL FAR PTR LAB ;IP← offset,CS ← segCALL FAR PTR PRO ;IP← [EA],CS ← [EA+2] 2.RET返回,又叫子程序返回,有段内返回和段间返回格式:RET ;段内IP← [SP + 1,SP],SP← SP + 2段间IP← [SP + 1,SP],SP← SP+ 2CS ← [SP + 1,SP],SP← SP+ 2RET n ;如上操作后,SP← SP + n例:RET ;段内返回RET 4 ;段内返回,并废除以前入栈的两个参数RET ;段间返回RET 12H ;段间返回,并废除以前入栈的9个参数三.条件转移指令根据标志寄存器的某些状态,决定程序执行流程,如果测试条件成立,则控制转移到指令所给的目的地址,否则顺序执行有16种类型,都是二字节指令格式:JO target ;溢出转移(OF=1)JNO target ;无溢出转移(OF=0)JE/JZ target ;相等/为0转移(ZF=1)JNE/JNZ target ;不相等/不为0转移(ZF=0)JS target ;符号位为1转移(SF=1)JNS target ;符号位为0转移(SF=0)JP/JPE target ;奇偶位为1/奇偶性为偶转移(PF=1)JNP/JPO target ;奇偶位为0/奇偶性为奇转移(PF=0)JC target ;有进位转移(CF=1)(又叫JB/JNGE ;低于/不高于不等于时转移)JNC target ;无进位转移(CF=0)(又叫JAE/JNB ;高于等于/不低于时转移)JBE/JNA target ;低于等于/不高于时转移(CF+ZF=1)JA/JNBE target ;高于/不低于不等于时转移(CF+ZF=0)JL/JNGE target ;小于/不大于不等于时转移(SF⊕OF=1)JGE/JNL target ;大于等于/不小于时转移(SF⊕OF=0)JLE/JNG target ;小于等于/不大于时转移(SF⊕OF)+ZF=1JG/JNLE target ;大于/不小于不等于时转移(SF⊕OF)+ZF=0 无符号数比较JB/JNAE(JC)带符号数比较JL/JNGEJAE/JNB(JNC)JGE/JNLJBE/JNA JLE/JNGJA/JNBE JG/JNLE 带符号数比较,用大于和小于无符号数比较,用高于和低于因此两数之间有五种关系:相等、高于、低于、大于、小于例:FFH与00H比较当无符号数时,FFH>00H,即FFH高于00H当带符号数时,FFH<00H,即FFH小于00H例:比较0200H和0201H单元两无符号数大小,并在0200H放大数,0201H中放小数START:MOV AL,[0200H]CMP AL,[0201H]JNC DONE ;(如果比较的是带符号数,则把JNC改为JGE)XCHG AL,[0201H]MOV [0200H],ALDONE:HLT四.迭代控制指令用CX作计数器,控制循环次数,有4条,都是二字节指令目的地址=源地址+2+disp8(用符号扩展成16位)或:目的地址=IP+disp8disp8是补码,范围–128~ + 1271.LOOP循环指令,执行CX-1后若CX不为0,则转移到目的地址,否则顺序执行格式:LOOP target ;若CX-1≠0循环,否则顺序执行例:将0400H~0407H单元的四个16位数分别与0408H~040FH 单元的四个16位数对应相加,并把结果放在0408H~040FH单元.设相加后无溢出0400H0401H0407H0408H0409H040FHMOV SI,0400H MOV SI,0400HMOV DI,0408H MOV CX,0004HMOV CX,0004H CYCLE:MOV AX,[SI] CYCLE:MOV AX,[SI] ADD [SI+8],AXADD [DI],AX INC SIINC SI INC SIINC SI LOOP CYCLEINC DI HLTINC DILOOP CYCLEHL T2.LOOPE/LOOPZ(loop on equal/loop on zero)相等/为0循环格式:LOOPE target ;若CX-1≠0且ZF=1循环,否则顺序执行LOOPZ target3.LOOPNE/LOOPNZ(loop on not equal/loop on not zero)不相等/不为0循环格式:LOOPNE target ;若CX-1≠0且ZF=0循环,否则顺序执行LOOPNZ target·LOOPE/LOOPZ和LOOPNE/LOOPNZ类似于JE/JZ和JNE/JNZ指令,但后者不执行CX-1并判别,故无计数功能例:从0B00H开始的存储单元存放着长度为256字节的含有“#”字符(ASCII码为23H)的字符串,请找出第一个“#”送AL,并将其所在地址送DXMOV CX,0100HMOV SI,0AFFHCYCLE:INC SICMP BYTE PTR [SI],23HLOOPNE CYCLEMOV AL,[SI]MOV DX,SIHLT4.JCXZ当CX=0时程序转移,CX≠0时顺序执行,用来控制CX=0时的循环格式:JCXZ target ;若CX=0转移,否则顺序执行五.中断指令用以启动中断及实现中断返回1.INT中断调用格式:INT n ;调用n号类型中断n为中断类型,0~255,立即数执行过程:SP←SP-2,[SP+1,SP] ←FLAGS,IF ←0,TF ←0SP←SP-2,[SP+1,SP]←CS,CS ←[n⨯4+2](中断指针第二字,即子程段基址)SP←SP-2,[SP+1,SP]←IP,IP←[n⨯4](中断指针第一字,即子程偏移地址)2.INTO溢出中断(单字节,CEH),若OF=1时产生软件中断,否则执行下一条指令格式:INTO ;调用溢出中断·INTO操作过程与INT n一样,对应n=4,但INT 4不测试OF标志3.IRET中断返回,用于退出硬件或软件启动的中断服务子程序,把控制返回断点格式:IRET ;中断返回执行过程:IP←[SP+1,SP],SP←SP+2CS ←[SP+1,SP],SP←SP+2FLAGS ←[SP+1,SP],SP←SP+24.INT3断点中断,又称一字节指令(CCH),用于在程序中任何位置设置断点格式:INT3 ;调用断点中断INT3与INT 3(二字节,CD 03)效果一样注:除中断指令外其他指令都不影响标志§3.7 处理机控制指令(processor control)一.状态标志位操作指令1.CLC(clear carry flag)清进位标志,不影响其他标志格式:CLC ;CF←02.CMC(complement carry flag)进位标志求反,不影响其他标志格式:CMC ;CF←CF3.STC(set carry flag)进位标志置位,不影响其他标志格式:STC ;CF←14.CLD(clear direction flag)清方向标志,在串操作中若DF=0,CPU自动将SI、DI取增量格式:CLD ;DF←05.STD(set direction flag)方向标志置位,在串操作中若DF=1,CPU自动将SI、DI取减量格式:STD ;DF←16.CLI(clear interrupt-enable flag)清中断标志,也叫关中断,当IF=0时CPU禁止可屏蔽中断请求格式:CLI ;IF←07.STI(set interrupt-enable flag)中断标志置位,也叫开中断,当IF=1时CPU可接受可屏蔽中断请求格式:STI ;IF←1二.外同步指令1.HLT处理机暂停,也叫停机,它使CPU进入暂停状态只有CPU复位或响应中断才能退出暂停状态格式:HLT ;暂停2.W AIT等待,完成CPU与外部处理机或硬件的同步,当TEST无效时(=1),W AIT指令使CPU进入等待状态,重复执行W AIT指令直至TEST有效(=0)格式:W AIT ;等待3.ESC处理机交权,CPU将执行的任务交给同一系统中的协处理器执行格式:ESC EXTER-OPCODE,SRC ;处理机交权4.LOCK总线封锁前缀格式:LOCK 指令;在执行LOCK后面的指令时封锁总线三.NOP指令(no operation)格式:NOP;空操作执行NOP,不作任何操作,占3T,IP加1∙机器指令执行时间的计算·段超越时,增加2T·存储器操作数为16位非对准字(或8088存取16位),增加一个总线周期(4T)·表中假定指令已被预取在指令队列中等待例:MOV AL,[BX] 8+EA,即8+5=13TADD AL,[DI+3] 9+EA,即9+9=18TMUL WORD PTR [200H] 124+EA,即124+6=130(BYTE PTR为71+EA)例:程序段:MOV AL,0 4TABC:INC AL 2T⨯256JNZ ABC 8T⨯255+4THL T 2T总时间为2562T若CPU的时钟频率为8MHZ,则T=125ns,总时间为125ns⨯2562=320.25μs本章要点:1.有效地址、偏移量、位移量2.8086/8088寻址方式、指令编码格式(会查指令表)指令操作内容及其在程序中的功能、用各种指令编程3.标志的设置4.寄存器在指令中的特殊用法,如:XLA T用BX、AL,乘除用Acc,CBW、CWD用Acc等等5.设置初始条件,如:串操作之前设SI、DI、CX、DF,用LOOP之前设CX,用SHL之前设CL等6.熟练掌握常用指令编程,如:传送、加减乘除、比较、逻辑操作、循环、条件转移等。