有答案的汇编习题 下载本文

(3)1010,1010,1100,1111B (4)11,0101,0011,0010,0101B 16、 (1)表示:1010,1011+0100,1100 结果:0FBH。 (2)表示:0101,0101+1011,0100 结果:9H。 (3)表示:0101,0101-0100,1100 结果:9H。 (4)表示:0101,0101-1011,0100 结果:A1H。 (5)表示:1010,1011-0100,1100 结果:4FH。 (6)表示:1010,1011-1011,0100 结果:FBH。

17、 (1)10100 (余数:100) (2)1001 (3)1011 (4)0100 (5)0010

18、总的来说可以概括为六个阶段: (1)8086/8088/80186. (2)80286. (3)80386. (4)80486. (5)Petium/MMX Petium. (6)Petium Pro/Petium II/Petium III。

19、整个1MB主存空间从低位地址到高位地址可分为4个区段:基本RAM区、保留RAM区、扩展ROM区和基本ROM区。

(1) 基本RAM区 (00000H-9FFFFH)。 该区共640KB,由DOS进行管理。 (2) 保留RAM区 (A0000H-BFFFFH)

该区段为系统安排的\显示缓冲存储区\,共128KB,由显示卡上的RAM芯片提供支持,用于存放屏幕显示信息。

(3) 扩展ROM区 (C0000H-DFFFFH)

该区共128KB,由I/O接口卡上的ROM芯片提供支持,用于为系统不直接提供支持的外设安排设备驱动程序。

(4) 系统ROM区 (E0000H-FFFFFH)

该区共128KB,由系统占用。它主要提供ROM-BIOS程序。 20、检查和修改寄存器内容的命令为R,它有三种格式如下: (1)显示CPU内所有寄存器内容和标志位状态,格式为:-R。 (2)显示和修改某个寄存器内容,格式为:-R register name。 (3)显示和修改标志位状态,格式为:-RF。

第二章 8086指令系统 习题答案

1、(1)状态标志:CF-进位标志,ZF-零标志,SF-符号标志,PF-奇偶标志 OF-溢出标志,AF-辅助进位标志。

(2)控制标志:DF-方向标志,IF-中断允许标志,TF-陷井标志。 2、8086机器代码格式一般是: 操作码 寻址方式 偏移量 立即数。

3、(1)源操作数为立即寻址,目的操作数为寄存器寻址。 (2)源操作数为寄存器相对寻址,目的操作数为寄存器寻址。 (3)源操作数为寄存器寻址,目的操作数为寄存器间接寻址。 (4)源操作数和目的操作数均为固定寻址。 4、此题要求出物理地址,物理地址的计算公式为: 段地址(段首地址)*10H+偏移地址(有效地址)

(1)源操作数为立即寻址方式,操作数地址就在本条指令中。 (2)源操作数为直接寻址方式,其物理地址为 DS*10H+100H=20100H

(3)源操作数为寄存器间接寻址,其物理地址为 SS*10H+BP=15010H

(4)源操作数为基址变址寻址,其物理地址为 DS*10H+BX+SI+VAL=201E0H

5、(1)源操作数为立即寻址,目的操作数为寄存器寻址。 (2)源操作数为直接寻址,目的操作数为寄存器寻址。 (3)源操作数为寄存器寻址,目的操作数为寄存器寻址。 (6)源操作数为寄存器寻址,目的操作数为基址变址寻址。 (7)源操作数为寄存器相对寻址,目的操作数为寄存器寻址。 (8)源操作数为相对基址变址寻址,目的操作数为寄存器寻址。 (9)源操作数为寄存器寻址。

6、(1)位移量D (2)BX (3)637DH (4)D5B4H (5)8E18H (6)1004FH

7、(1)此指令中AH与BX分别为8位和16位寄存器,所以类型不匹配。

(2)此指令中源地址和目的地址均为寄存器间接寻址的两个存储单元,而MOV指令不允许两存储单元间直接传送信息。

(3)源地址为基址变址寻址,则SI(或DI)应与BP或BX组合使用,而SI、DI不能一起使用。 (4)目的操作数地址在本指令中用伪操作PTR将字类型改变成了字节类型。因此源操作数1000只能是字节立即数,否则类型不匹配。但一字节宽度仅为一个8位的二进制数,能表达的最大数为28=256,显然1000超出了一个字节的范围。

(5)虽然MOV指令允许寄存器与段寄存器交换信息,但CS不能用作目的寄存器。

8、4条指令的目的操作数都是基址加变址寻址方式。第(1)、(3)两条指令选用了BX作基址寄存器,(2)、(4)两条指令选用了BP作基址寄存器,所以,AX、CX的内容将送往数据段中的相应单元,BX、DX的内容将送往堆栈段中的相应单元。 第(1)条:

目的操作数地址:EA=[BX]+[SI]+1=300H+50H+1=351H PA=(DS)左移4位+EA=1035H 源操作数地址: AX

执行: (AX)—>10351H 第(2)条:

目的操作数地址:EA=[BP]+[SI]+2=452H PA=(SS)左移4位+EA=20452H 源操作数地址: BX

执行: (BX)—>20452H 第(3)条:

目的操作数地址:EA=[BX]+[DI]+3=363H PA=(DS)左移4位+EA=10363H 源操作数地址: CX

执行: (CX)—>10363H 第(4)条:

目的操作数地址:EA=[BP]+[DI]+4=464H PA=(SS)左移4位+EA=20464H 源操作数地址: DX 执行: (DX)—>20464H

上述4条指令执行后,存储器中相应单元的内容如下: (10351H)=12 ;由第(1)条指令送入

(20452H)=300H ;由第(2)条指令送入 (10363H)=13 ;由第(3)条指令送入 (20464H)=15 ;由第(4)条指令送入

9、MOV BX,OFFSET TAB ;变量TAB的EA—>BX MOV AL,4 ;TAB表中第五项的位移量4—>AL XLAT TAB ;([BX+AL])=(TAB+4)=34H—>AL 10、MOV SI,OFFSET NUM ;将NUM的EA—>SI LEA SI,NUM ;与上一条语句等效 MOV AX,[SI] ;([SI])—>AX

LEA AX,[SI] ;将SI所指的存储单元的EA—>AX

LEA DI,4[SI] ;取以NUM为首址的第三个字符存储单元的EA—>DI LEA POIN,BUF ;错误语句,因为OPD不是寄存器 MOV POIN,OFFSET BUF ;将BUF的EA—>POIN 11、编程如下: MOV AX,SUB1 SUB AX,SUB2

MOV DSUB,AX ;两低位字相减,结果—>DSUB MOV AX,SUB1+2

SBB AX,SUB2+2 ;两高位字相减,并减去低位的借位CF MOV DSUB+2,AX

12、AL=0B4H为无符号数的180D,为有符号数的-76D;BL=11H为无符号数的17D,为有符号数的+17D。 MUL BL的执行结果为 AX=180D*17D=3060D=0BF4H。 IMUL BL的执行结果为 AX=(-76D)*17D=-1292D=0FAF4H。

又两乘积结果在AX中的高位数(在AH中)均不为0,所以两条指令均置OF=CF=1。 13、按先后顺序写出完成题目要求的4个功能的程序段如下: MOV AL,25H ;AL<-25H

SHL AL,1 ;用逻辑左移指令左移一次,实现AL<-AL*2 MOV BL,15H ;BL<-15H MUL BL ;AX<-AL*BL 上段程序执行后,AX=25H*2*15H=612H.。 14、编写的程序段如下: MOV AX,4001H CWD MOV CX,4 IDIV CX

执行以上程序段后,商在AX中,余数在DX中,运算的结果为: (AX)=1000H,(DX)=1。

15、执行完以上三条语句后,(AX)=0FFF9H,(SI)=0FFF9H。

16、该程序所完成的运算算式为:(a*b+c-70)/a并将运算结果存入变量D中,而余数存入D+2中(表达式中的a,b,c均为数值常量)。 17、首先列已知条件:

除数为非压缩的BCD数3,被除数为非压缩的BCD数53.被除数和除数的内存地址均未给出,我们可以随意给定,假设53存放在B字节单元中,3存放在A字节单元中。 其次确定算法:

字节除法要求被除数在AX中,结果的8位商在AL中,8位余数在AH中。因此首先应将被除数置AX中,最后再将结果的商按要求存放在字节单元C中,余数存放在字节单元R中。编程时应注意,对两位非压缩BCD数与一位非压缩BCD数相除,应先用AAD指令将AX中的被除数调整成二进制数并存放在AL中,然后再用DIV指令实现除法运算。 最后编程如下:

MOV AH,0 ;AH<-0

MOV AL,B+1 ;AL<-5(被除数十位) DIV A ;除法,第一个余数在AH中 MOV C+1,AL ;[C+1]<-第一个商 MOV AL,B ;AL<-3(被除数的个位) AAD ;调整 DIV A ;除法

MOV C,AL ;C<-7(第二个商) MOV R,AH ;R<-2(第二个余数)

运算后的结果为[C]=07H,[C+1]=01H,[R]=02H,即商为17,余数为2,结果正确。 18、指令序列如下: MOV AL,BCD1 ADD AL,BCD2 DAA

MOV BCD3,AL MOV AL,BCD1+1 ADC AL,BCD2+1 DAA

MOV BCD3+1,AL 最后(BCD3)=4623结果正确。

19、在第三个语句中,AND出现了两次,但这两个AND所代表的意义是截然不同的。第二个AND是常量运算符。因而,“A AND 0FDH”是表示要进行逻辑运算的数值表达式,它是在汇编期间被运算出来的,结果为0B4H。而第一个AND是机器指令逻辑乘的指令助记符。它的源操作数是采用立即方式寻址,立即操作数为0B4H,该指令将被汇编程序翻译成目标代码,只有在CPU执行该目标代码时,才能完成(AL)∧0B4H—>AL的操作,最后AL中的内容为0A0H。 20、(1)要屏蔽某些位,可以用AND指令。 MOV AL,0BFH AND AL,0FCH

指令执行后的结果为AL=0BCH。

(2)将给定数的某位置1,可以用OR指令。 MOV AL,43H OR AL,20H

指令执行后的结果为AL=63H。

(3)要测试给定数的某位是否为0,可用TEST指令。 MOV AL,40H TEST AL,0AFH

指令执行结果为00H。显然标志位CF=OF=0,SF=0,ZF=1,说明要测试的40H的第0,1,2,3,5,7位均为0。 (4)要测试操作数的某位是否为1,可先将该操作数按位取反,然后再用TEST指令测试。 MOV DL,AL