1、第 3 章 80x86 指令系统3-1 指令由 操作码 字段和 操作数 字段组成。8086 的指令长度在 16 字节 范围。3-2 分别指出下列指令中源操作数和目的操作数的寻址方式。若是存储器寻址,使用表达式表示出 EA=? PA=?(1) MOV SI, 2100H (2) MOV CX, DISPBX (3) MOV SI, AX (4) ADC ZX, BXSI (5) AND AX, DX (6) MOV AX, BX+10H(7) MOV AX, ES:BX (8)MOV AX, BX+SI+20H (9) MOV BP, CX(10) PUSH DS解:源操作数寻址 目的操作数寻址
2、 EA PA1) MOV SI, 2100H 立即数寻址 寄存器 (2) MOV CX, DISPBX 寄存器相对寻址 寄存器 BX+SISP (DS)*16+(BX+DISP)(3) MOV SI, AX 寄存器寻址 寄存器间接 SI (DS)*16+(SI)(4) ADC ZX, BXSI 基址变址寻址 寄存器 BX+SI (DS)*16+(BX)+(SI)(5) AND AX, DX 寄存器寻址 寄存器 (6) MOV AX, BX+10H 寄存器相对寻址 寄存器 BX+DISP (DS)*16+(BX)+10H(7) MOV AX, ES:BX 带段超越寄存器寻址 寄存器 BX (ES
3、)*16+(BX)(8)MOV AX, BX+SI+20H 相对基址变址寻址 寄存器 BX+SI+20H (DS)*16+(BX)+(SI)+20H(9) MOV BP, CX 寄存器寻址 寄存器间接 BP (SS)*16+(BP)(10) PUSH DS 固定寻址 寄存器 SP (SS)*16+(SP)3-3 已知 8086 中一些寄存器的内容和一些存储器单元的内容如图 3-1 所示,试指出下列各条指令执行后,AX 中的内容。(1) MOV AX, 2010H (2) MOV AX, BX (3) MOV AX, 1200H(4) MOV AX, BX (5) MOV AX, 1100HBX
4、 (6) MOV AX, BXSI(7) MOV AX, 1100HBX+SI (8) MOVLEA AX, SI 解:(1) (AX)=2010H (2) (AX )=0100H (3) (AX )=4C2AH (4) (AX )=3412H(5) (AX)=4C2AH (6) (AX)=7856H (7) (AX )=65B7H (8) (AX)=0002H图 3-1 3-4 已知(AX)=2040H,(DX)=380H,端口(PORT)=(80H)=1FH, (PORT+1)=45H,执行下列指令后,指出结果等于多少?解:(1)OUT DX, AL (0380H)=40H(2)OUT D
5、X, AX (380H)=40H (381h)=20H(3)IN AL, PORT (AL)=1FH (4)IN AX, 80H (AX)=451FH(5)OUT PORT1, AL (PORT1)=40H(6)OUT PORT1, AX (PORT1)=2040H3-5 已知:(SS)=0A2F0H,(SP)=00C0H,(AX)=8B31H,(CX)=0F213,试画出下列指令执行到位置 1 和位置 2 时堆栈区和 SP 指针内容的变化示意图。图中应标出存储单元的实际地址PA。PUSH AXPUSH CX ;位置 1POPF ;位置 2解:已知(SS)=0A2F0H,指令顺序依次编号为、
6、,示意图如图所示:(SS)=0A2F0H0A2FBCH 13H (SP)-4=00BCH (位置 1)F2H0A2FBEH 31H (SP)-2=00BEH (SP)+2=00BCH +0002H=00BEH (位置2)8BHM30100H 12H30101H 34H30102H 56H30103H 78H 31200H 2AH31201H 4CH31202H B7H31203H 65HCPUBX 0100HSI 0002HDS 3000H0A2FC0H (SP)=00C0H3-6 识别下列指令的正确性,对错误的指令,说明出错的原因。(1) MOV DS, 100(2) MOV 1000H,
7、23H(3) MOV 1000H,2000H(4) MOV DATA, 1133H(5) MOV 1020H, DX(6) MOV AX, 0100H+BX+BP(7) MOV CS, AX(8) PUSH AL(9) PUSH WORD PTRSI(10) IN AL, 80H(11) OUT CX, AL(12) IN AX, 380H(13) MOV CL, 3300H(14) MOV AX, 2100HBP(15) MOV DS, ES(16) MOV IP, 2000H(17) PUSH CS(18) POP CS(19) LDS CS, BX(20) MOV GAMMA, CS解:
8、(1),不能对段寄存器送立即数(2),存储单元类型不正确(3),MOV 不能实现两个存储单元间直接传送(4),段名不能作目的操作数(5),立即数不能作目的操作数(6),基址寄存器 BX 和 BP 只能使用其中一个(7),CS 不能用作目的操作数(8),堆栈操作作为字操作 AL 应改为AX(9)(10),80H 为输入端口号不加方括号(11),应输出到端口而不是通用寄存器(12),用 DX 做间址寄存器 380H 应存DX(13),类型不匹配(14)(15),两个段寄存器间不能直接传送(16),IP 不能直接用作目的操作数(17)(18),CS 不能做目的操作数(19),目的操作数应是通用寄存器
9、而不能是段寄存器 CS(20),符号名不能作为目的操作数3-7 已知存储器数据段中的数据如图 3-3 所示。阅读下列的两个程序段后,回答:1. 每个程序段的运行结果是什么?2. 两个程序段各占多少字节的内容,执行时间是多少?(1) LES SI, NUM1MOV AX, SIADD AX, 4SIMOV 8SI, AXADD SI, 2MOV AX, SIADC AX, 4SIMOV 8SI, AX(2) MOV AX, NUM1ADD AX, NUM2MOV SUM, AXMOV AX, NUM1+2ADC AX, NUM2+2MOV SUM+2, AX解:1、运行结果如下:(1) 0AC6
10、863A0H (2) 0AC6863A02、 时钟周期 字节数 (1) LES SI, NUM1 2+EA 24MOV AX, SI 10 3ADD AX, 4SI 9+EA 24MOV 8SI, AX 10 3ADD SI, 2 4 34MOV AX, SI 10 3 ADC AX, 4SI 9+EA 24MOV 8SI, AX 10 24(2) MOV AX, NUM1 10 3ADD AX, NUM2 9+EA 24MOV SUM, AX 9+EA 24MOV AX, NUM1+2 9+EA 24ADC AX, NUM2+2 9+EA 24MOV SUM+2, AX 9+EA 24图 3
11、-33-8 已知数据如图 3-3 所示,数据的低位在前,按下列要求编写程序段:1. 完成 NUM1 和单元 NUM2 两个字数据相加,和存放在 NUM1 中。2. 完成 NUM1 单元开始的连续 4 个字节数据相加,和不超过一字节,存放 SUM 单元。3. 完成 NUM1 单元开始的连续 8 个字节数据相加,和 16 位数,放在 SUM 和 SUM+1 两个单元(用循环) 。4. 完成 NUM1 和 NUM2 的双倍精度字数据相加,和放在 NUM2 开始的字单元中。解:1、CLCLEA SI, NUM1MOV AX, WORD PTR SIADD AX, WORD PTR NUM2MOV WO
12、RD PTR SI, AXMOV AX, WORD PTR SI+2ADC AX, WORD PTR NUM2+2MOV WORD PTR SI+2, AXHLT2、LEA SI, NUM1MOV AL, SIADD AL, 1SIADD AL, 2SIADD AL, 3SIMOV SUM, ALMNUM1 48H DS41H16H28HNUM2 58H22H52H84HSUMHLT3、 CLCCLDLEA SI, NUM1MOV AL, SIMOV AH, 0MOV CX, 7XOR BH, BHAGA: MOV BL, 1SIADC AX, BXINC SIDEC CXJNZ AGAMOV
13、 SUM, AXHLT4、LEA SI, NUM1LEA DI, NUM2MOV AX, SIADD AX, DIMOV DI, AXMOV AX, 2SIADC AX, 2DIMOV 2DI, AX3-9 已知的 BCD 数如图 3-3 所示,低位在前,按下列要求编写计算 BCD 数据(为组合型BCD)的程序段。1.完成从 NUM1 单元开始的连续 8 个组合型 BCD 数相加,和(超过一字节)放在 SUM和 SUM+1 两个单元中。2.完成 NUM1 单元和 NUM2 单元的两个 BCD 数相减,其差存入 SUM 单元,差=?,(CF) =?解:1、 CLCCLDLEA SI, NUM1M
14、OV CX, 7MOV AH, 0MOV AL, SIAGA: INC SIADC AL,SIDAALOOP AGAMOV SUM, ALMOV SUM+1, AHHLT2、 CLCMOV AH, 0MOV AL, NUM1SUB AL, NUM2DASMOV SUM, AL差=0F0H=-10H, CF=13-10 写出下列程序段完成的数学计算公式,并画出数据存放的示意图。MOV AX, XMOV DX, X+2ADD AX, YADC DX, Y+2SUB AX, ZSBB DX, Z+2MOV W, AXMOV W+2, DX解:W=X+Y-Z,数据存放如图所示:3-11 已知数据如图
15、3-3 所示,低位在前,按下列要求编写程序段1. NUM1 和 NUM2 两个数据相乘(均为无符号数) ,乘积放在 SUM 开始的单元。2. NUM1 和 NUM2 两个字数据相乘(均为无符号数) ,乘积放在 SUM 开始的单元。3. NUM1 单元的字节数据除以 13(均为无符号数) ,商和余数依次放入 SUM 开始的两个字节单元。4. NUM1 单元的字节数据除以 NUM2 字单元的字,商和余数依次放入 SUM 开始的两个字节单元。解:1. 为 32 位32 位,极为 64 位2. MOV AX, NUM1IMUL NUM2 ;积在(DX) (AX) 中MOV SUM, AXXX+2YY+
16、2ZZ+2WW+2MOV SUM+2, DX3. MOV AL, NUM1CBWMOV CL, 0DHDIV CLMOV SUM, ALMOV SUM+1, AH4. MOV AX, NUM1CWDIDIV NUM2MOV SUM, AXMOV SUM+2, DX3-12 (L 略)3-13 已知(AL)=0C4H,DATA 单元中的内容为 5AH,写出下列每条指令单独执行后的结果。1. AND AL, DATA2. OR AL,DATA3. XOR AL, DATA4. NOT DATA 5. AND AL, 0FH6. OR AL, 01H7. XOR AL, 0FFH8. TEST AL
17、, 80H解;1. (AL)=01000000B=40H2. (AL)=0DEH3. (AL)=10011110B=9EH4. (DATA)=0A5H5. (AL)=04H6. (AL)=0C5H7. (AL)=3BH8. (AL)=0C4H,OF=0,CF=03-14 用移位循环指令,编写完成以下功能的程序段(结果放回原处)1. 将无符号数 83D 分别乘 2 和处 2.2. 将带符号数-47D 分别乘 2 和除 2.3. 将图 3-3 中 NUM1 双字乘 2 和除 2.4. 将图 3-3 中从 NUM1 开始的 4 个字乘 2.解:1. MOV AL, 53HSHL AL, 1MOV A
18、L, 53HSHR AL, 12. MOV AL, 0D1HSAL AL, 1MOV AL, 0D1HSAR AL, 13. MOV AX, NUM1MOV DX,NUM1+2SHL AX, 1RCL DX, 1MOV AX, NUM1MOV DX, NUM1+2SAR DX, 1RCR AX, 14. SAL NUM1, 1RCL NUM1+2, 1RCL NUM1+4, 1RCL NUM1+6, 13-15 编写完成以下功能的程序段,并指出运行后,其标志 CF、ZF、SF 和 OF 的状态是什么?1. BCD 数 58322. 无符号数 3AH3AH3. 带符号数 79(57)4. 带符号
19、数32+(42)解:1. MOV AL, 58HSUB AL, 32HDASCF=0,ZF=0,SF=0,OF=02. MOV AL, 3AHSUB AL, 3AHCF=0,ZF=1,SF=0,OF=03. 已知 X=79D,Y=57D 则【 X】补=01001111, 【Y】补=11000111所以X补 Y补=X补+-Y补=10001000MOV AL, 79MOV BL, -57SUB AL, BLCF=0,ZF=0,SF=1,OF=14. MOV AL, 0F3HMOV BL, 2AHADD AL, BL或者MOV AL, 0F3HADD AL, 2AHCF=0,ZF=0,SF=0,OF
20、=03-16 用循环移位指令实现下列功能,设(AX)=0C3H1. 设(CL)=8,移位前、后 AX 内容不变2. 设(CL)=9,移位前、后 AX 内容不变3. 将 AX 中高 4 位和低 4 位交换位置4. 将 AX 中高 4 位放到低 4 位上,而高 4 位置 0解:1. MOV CL, 8ROL AL, CL(或者 ROR AL, CL)2. MOV CL, 9RCL AL,CL(或者 RCR AL, CL)3. MOV BX, AXAND AX, 0FF0HXCHG BH, BLMOV CL, 4ROL BH, CLROL BL, CLAND BH,0F0HAND BL, 0FHOR
21、 AX, BX4. 本小题可以多种解法:解 1:5. MOV BX, AXAND AX, 0FF0HXCHG BH, BLMOV CL, 4ROL BH, CLROL BL, CLAND BH,0AND BL, 0FHOR AX, BX解 2:MOV BX, AXXCHG AH, ALMOV CL, 4 ROR AX, CLSHR AH, CLAND AL, 0FHAND BL, 0FOHOR AL, BL3-17 写出下列程序段执行后的结果:(AL )=?(DL)=?完成的是什么功能?MOV CL,4MOV AL,87MOV DL, ALMOV AL,0FHOR AL,30HSHR DL,C
22、LOR DL,30H解:完成与、或、移位等逻辑运算,运算结果:(AL)=37H;(DL )=35H3-18 用乘法指令和用传送、移位、相加指令分别实现 Y=10X 的运算,设 X=12H,分别编写这两个程序段。解:(1) MOV AL, XMOV CL, 10NUL CL(2) MOV AL, XSAL AL,1 ;(AL)=2*XMOV BL, AL ;(BL)=X*2SAL AL, 1 ;(AL)=4*XSAL AL, 1 ;(AL)=8*XADD AL, BL ;(AL)=8*X+2*X=10*X3-19 写出下面指令序列完成的数学计算是什么?MOV CL, 3SHL AX, CLSHL
23、 BL, CLSHL CX, CLSHL DH, CL解:将一多精度数(6 字节)乘以 83-20 写出下列能代替重复串操作指令完成同样功能的指令序列。(1)REP MOVSW(2)REP CMPSB(3)REP SCASB(4)REP LODSW(5)REP STOSB解:(1) LEA SI, AREA1LEA DI, AREA2MOV CX, NCLDAGA: MOV AX, DS:SIMOV ES:DI, AXINC SIINC SIINC DIINC DIDEC CXJNZ AGARET(2) LEA SI, VAR1LEA DI, VAR2MOV CX, NCLDNEXT: CMP
24、SBJNZ FINLOOP NEXTRET(3) MOV DI, OFFSET COMMANDMOV AL, MOV CX, NCLDNEXT: SCASBJZ FOUNDLOOP NEXTRET(4) MOV SI, OFFSET BUFMOV CX, NCLDNEXT: LODSWMOV RES, AXLOOP NEXTRET(5) MOV DI,OFFSET BUFMOV CX, NCLDNEXT: STOSBDEC CXJNZ NEXTRET 3-21 欲将数据段中自 AREA1 中的 100 个字数据搬到附加段中以 AREA2 开始的区中,用下面的 3 种传送指令编写程序段:1. 用
25、 MOV 指令;2. 用基本串传送指令;3. 用重复串传送指令解: 1. LEA SI, AREA1LEA DI, AREA2MOV CX, 100CLDAGAIN: MOV AX, SIMOV ES:DI, AXINC SIINC SIINC DIINC DIDEC CXJNZ AGAINRET2. MOV SI, OFFSET AREA1MOV DI, OFFSET AREA2MOV CX, 100CLDAGAIN: MOVS AREA2, AREA1DEC CXJNZ AGAINRET3. MOV SI, OFFSET AREA1MOV DI, OFFSET AREAA2 CLDMOV
26、CX, 100REP MOVSBRET3-22 假定在数据段中已知字符串和未知字符串的定义如下:STRING1 DB MESSAGE AND PROCCESSSTRING2 DB 20 DUP(?)用串操作指令编写完成下列功能的程序段(设 DS 和 ES 重叠) ;1. 从左到右把 STRING1 中的字符串搬到 STRING2 中;2. 从右到左把 STRING1 中的字符串搬到 STRING2 中;3. 搜索 STRING1 字符串中是否有空格。如有,记下第一个空格的地址,并放入 BX 中;4. 比较 STRING1 和 STRING2 字符串是否相同。解:1. MOV SI, OFFSE
27、T STRING1MOV DI, OFFSET STRING2MOV CX, 20 ;共 20 个字符CLD ;从左到右就是增址方向,设置 DF0 REP MOVS STRING2, STRING12. MOV SI, OFFSET STRING1+13H MOV DI, OFFSET STRING2+13HMOV CX, 20STD ;从右到左为减址方向,设置 DF0REP MOVS STRING2+13H, STRING1+13H3. MOV DI, OFFSET STRING1MOV CX, 20MOV AL, 20H ;空格字符的 ASCII 码CLDREPNZ SCASBJZ FOU
28、NDMOV DI, 0JMP DONEFOUND; DEC DI ;因 SCASB 的功能是:(1) (AL)DI(2) DI DI+1MOV BX, DIDENE: HLT 4. MOV SI, OFFSET STRING1MOV DI, OFFSET STRING2MOV CX, 20CLDREPZ CMPSBJNZ UMMATMOV AL, 0JMP OUTPUTUMMAT: MOV AL, 0FFHOUTPUT: MOV RESULT, ALRET 3-23 下面两条短转移指令的转移地址 ADDR1 和 ADDR2 分别是多少(用十六进制表示)?1. 0220 EB 0A JMP AD
29、DR12. 0230 EB F7 JMP ADDR2解:1. e 为当前 IP 与目的地址的距离。已知位移量 e 的计算公式:e=目的地址(IP 源+2) ,即0AH=目的地址 (IP 源+23)=ADDR10222H所以,ADDR1=0AH+0222H=022CH(正向转移)2. e=目的地址(IP 源+2) 0F7H=ADDR20232H所以,ADDR2=0F7H+0232H=0229H(负向转移)3-24 NEAR JMP, SHORT JMP,LOOP 和条件转移指令的转移范围是多少?解:(1)NEAR JMP:目标地址距 JMP 指令+3276732768 字节范围以内。(2)SHO
30、RT JMP:目标地址距 JMP 指令+127128 字节范围以内。 (3)LOOP:所转去的目标地址在+127 128 字节范围以内,为 LOOP SHORT_LABEL(4)条件转移指令:目的地址 OPRD 为近标号,即转向的目标地址必须在转移指令的+127128 字节范围以内。2-25 设 AX 和 CX 中的内容为无符号数,BX 和 DX 中的内容为带符号数,试用 CMP 指令和条件转移指令实现以下判断:1. 若(AX)超过(CX) ,则转至 BIGER。 2. 若(BX)(DX ) ,则转至 BIGE。3. 若(CX)低于(AX) ,则转至 LESS。 4. 若(DX)(BX ) ,
31、则转至 LESS。5. 若(AX)=(CX ) ,则转至 EQUAL。解:1. CMP AX, CXJA BIGER2. CMP BX, DXJG BIGER3. CMP CX, AXJB LESS4. CMP DX, BXJL LESS5. CMP AX, CXJZ EQUAL3-26 (略)3-27 试编写一个程序段,能完成下列数学表达式的功能1(-0X) ) ( 解 1:MOV AL, XCMP AL,-1JLE ANS1CMP AL,1JL ANS2JMP ANS3ANS1: MOV SI1,-1ANS2: MOV S2, 0RETANS3: MOV S3, +1DONE: RET解
32、2:MOV AL, XCMP AL,0FFHJLE LOON1CMP AL, 1JGE LOON2MOV AL, 0MOV X, ALJMP NEXTLOON1: MOV AL, 0FFHMOV X, ALJMP NEXTLOON2: MOV AL, 1MOV X, ALNEXT: RET3-28 8086 的中断机构中共允许 256 级中断,其专用的中断有 5 个,分别为 类型 0类型 4 3-29 试比较转移指令,调用指令和中断指令操作的异同处。解:这 3 种指令其共同处是改变了程序指令执行的顺序,从一条指令跳到另一条指令。其中,转移指令跳转后一般不会返回原指令的下一条指令;而调用指令在子
33、程序执行完毕后会返回原指令的下一条指令继续执行;中断指令是在 CPU 遇到中断产生后,停止当前指令的执行,在处理完中断服务程序后,继续从执行中断前的指令处开始运行。3-30 用 DOS 系统功能调用编写一个程序,能将 3-17 题中的结果在屏幕上显示出来。解:已知 3-17 题的结果是:( AL)=37H, (DL)=35H。程序如下:MOV BL, ALMOV DH, DLMOV CL, 4SHR AL,CLOR AL,30HMOV DL, ALMOV AH,02HINT 21HMOV AL, 0FHOR AL,30HMOV AH, 02HINT 21HMOV DL,DHMOV CL, 4S
34、HR DL,CLOR DL, 30HMOV AH, 02HINT 21HMOV DL, 0FHOR DL, 30HMOV AH, 02HINT 21HHLT3-31 (略)3-32 (略)3-33 试写出 80386/80486CPU 执行下列指令后,AX=?,BX=?(1)MOV AX, 0000MOV BX,123HSHLD AX, BX,8(2) MOV AX,0000MOV BX, 123HMOV CL, 0CHSHRD AX, BX, CL 解: (1)AX=0012H,BX1234H (2)AX=0123H,BX=1234H3-34 试写出 80386/80486 CPU 执行下列指令后,标志 CF=?MOV EAX, 96ABDC86HBT EAX, 14H解: CF=0