《汇编语言程序设计习题及答案.pdf》由会员分享,可在线阅读,更多相关《汇编语言程序设计习题及答案.pdf(75页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!汇编语言程序设计 习题及参考答案 习题一 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!1.1 把下列 2、8、16 进制数转换成为十进制数(1)(1011011)2(2)(0.10110)2(3)(111111.01)2(4)(1000001.11)2(5)(377)8 (6)(0.24)8 (7)(3FF)16 (8)(2A.4)16 解:(1)(1011011)2=64+16+8+2+1=91 另解:原式=(5B)16=516+11=91(2)(0
2、.10110)2=0.5+0.125+0.0625=0.6875(3)(111111.01)2=32+16+8+4+2+1+0.25=63.25 另解:原式=(1000000-1+0.01)2=64-1+0.25=63.25(4)(1000001.11)2=64+1+0.5+0.25=65.75(5)(377)8=364+78+7=255 另解:原式=(400-1)8=464-1=255(6)(0.24)8=20.125+40.015625=0.3125(7)(3FF)16=3256+1516+15=1023 另解:原式=(400-1)16=4256-1=1023(8)(2A.4)16=216
3、+10+40.0625=42.25 另解:原式=216+10+416=42.25 1.2 把下列十进制数转换为 2、16 进制数 (1)(127)10 (2)(33)10 (3)(0.3)10 (4)(0.625)10 (5)(1023.5)10(6)(377)10 (7)(1/1024)10(8)(377/32)10 解:(1)(127)10=64+32+16+8+4+2+1=(111 1111)2=(7F)16 另解:原式=(128-1)10=(1000 0000-1)2=(111 1111)2=(7F)16 (2)(33)10=32+1=(10 0001)2=(21)16 (3)(0.3
4、)10=(0.0100 1100 1)2=(0.4CCC)16(4)(0.625)10=0.5+0.125=(0.101)2=(0.A)16(5)(1023.5)10=512+256+128+64+32+16+8+4+2+1+0.5=(11 1111 1111.1)2=(3FF.8)16 (6)(377)10=256+64+32+16+8+1=(1 0111 1001)2=(179)16(7)(1/1024)10=(0.0000 0000 01)2=(0.004)16 (8)(377/32)10=(256+64+32+16+8+1)(32)=(101111001)2(100000)2=(101
5、1.11001)2=(0B.C1)16 1.3 把下列二进制数转换为十六进制数 (1)(100011)2(2)(0.11101)2(3)(11111.11)2(4)(0.00101)2 解:(1)(100011)2=(10 0011)2=23H(2)(0.11101)2=(0.1110 1000)2=0.E8H(3)(11111.11)2=(1 1111.1100)2=1F.CH(4)(0.00101)2=(0.0010 1000)2=0.28H 1.4 把下列十六进制数转换为二进制数 (1)(3B6)16 (2)(100)16 (3)(80.2)16 (4)(2FF.A)16 解:(1)(3
6、B6)16=(0011 1011 0110)2(2)(100)16=(0001 0000 0000)2 (3)(80.2)16=(1000 0000.0010)2 (4)(2FF.A)16=(0010 1111 1111.1010)2 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!1.5 如果用 24b 储存一个无符号数,这个数的范围是什么?如果储存的是一个补码表示的有符号数,那么这个数的范围又是什么?答:如果用 24b 储存一个无符号数,这个数的范围应为:0224-1 如果用 24b 储存一个补码表示的有符号数,这个数的范围应为:-223+22
7、3-1 1.6 两个无符号数,它们的大小等于十进制数 210 和 303,用 N 位二进制存储时,相加产生了进位,用 N+1 位二进制存储时,相加没有产生进位。这个N 等于多少?为什么?答:210+303=513,29513X2X3X1X4 1.10 用 8 位补码完成下列运算,用二进制“真值”的格式给出运算结果,并指出运算后 CF、OF、ZF、SF、PF 标志位的状态。(1)127+126 (2)126-127 (3)-100-120 (4)-100-(-120)解:(1)127+126 127补=0111 1111,126补=0111 1110,127+126补=1111 1101,127
8、+126=-0000 0011(溢出)COZSP=01010 (2)126-127 126补=0111 1110,-127补=1000 0001,126-127补=1111 1111,126-127=-000 0001 COZSP=10011 (3)-100-120 -100补=1001 1100,-120补=1000 1000,-100-120补=0010 0100,-100-120=+0010 0100(溢出)欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!COZSP=01001 (4)-100-(-120)-100补=1001 1100,-1
9、20补=1000 1000,-120补求补=0111 1000,-100-(-120)补=0001 0100,-100-(-120)=+0001 0100 COZSP=00001 1.11 把二进制代码 1001011101011000 分别“看作”是:(1)二进制无符号数(2)二进制补码(3)压缩 BCD 码(4)非压缩 BCD 码 哪一种情况下它代表的“值”最大?答:看作二进制无符号数时,它代表的“值”最大。分析:看作二进制补码时,它代表一个负数,而其它的情况下,它均为正数。因此,看作二进制补码时,它代表的值最小。把这组代码用十六进制数字形式写出:9758 对于无符号数,它的值等于十六进制
10、的 9758H;对于压缩 BCD 码,它的值等于十进制的 9758,显然小于 9758H;对于非压缩 BCD 码,它的值等于十进制的 78,显然更小于 9758H;因此,看作二进制无符号数时,它代表的“值”最大。1.12 CPU 使用“寄存器”有什么好处?为什么?答:CPU 使用寄存器主要有两个好处:(1)寄存器位于 CPU 内部,访问寄存器比访问内存储器速度快;(2)寄存器数量大大少于内存储器单元个数,标识寄存器使用的二进制代码比标识内存储器单元使用的二进制代码少得多,可以缩短指令长度。1.13 已知 8086 系统某存储单元物理地址为 12345H,写出 4 个可以与它对应的“逻辑地址”。
11、答:可以与物理地址 12345H对应的逻辑地址有:1234H:0005H,1230H:0045H,1220H:0145H,1224H:0105H,1.14 已知 8086 系统某存储单元物理地址为 12345H,可以与它对应的“逻辑地址”中,段基址最大值,最小值分别是多少?答:可以与物理地址 12345H对应的逻辑地址中,段基址的最大值为 1234H,最小值为 0235H。分析:偏移地址取最大值时,对应的段基址为最小。偏移地址可选的最大值为 0FFF5H(最后一位必须为 5),因此最小的段基址=(12345H-0FFF5H)/10H=0235H。偏移地址取最小值时,对应的段基址最大。偏移地址可
12、选的最小值为 0005H(最后一位必须为 5),因此最大的段基址=(12345H-0005H)/10H=1234H。1.15 8086 微机最多可以有多少个不同的“段基址”?为什么?答:由于段基址由 16 位二进制数表示,因此可以有 216=65536 个不同的段基址。1.16 在图 1-6 中,假设已有(R1)=X,(R2)=Y,分别用它的机器指令和符号指令写出计算 R04X2Y 的程序。想一想,怎样做才能尽量减少指令数量?答:假设已有(R1)=X,(R2)=Y,可以编制如下计算 R04X2Y 的程序:符号指令 机器指令 注释 MOV R0,R1 1 000 00 01(81H)R0X AD
13、D R0,R1 1 001 00 01(91H)R0XX 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!ADD R0,R2 1 001 00 10(92H)R02XY ADD R0,R0 1 001 00 00(90H)R04X2Y 减少指令的方法是先计算出 2X+Y,然后再计算 4X+2Y。可以有多种不同的写法。1.17 什么是“逻辑地址”?什么是“线性地址”?什么是“物理地址”?它们如何转换?答:由段的起始地址(段基址)或者段的编号和段内相对地址两部分表示的地址称为“逻辑地址”。经过“分段机构”处理后,用一组二进制代码表示的地址称为“线性地址
14、”。经过“分页机构”处理后,用一组二进制代码表示的存储单元的“真实”的地址称为“物理地址”。物理地址的位数等于地址总线的宽度。工作在实地址模式下的 80X86MPU 不使用线性地址,物理地址=段基址16+段内偏移地址。80X86MPU 工作在保护模式下时,分段机构用段的编号在“段描述符表”中找到段的起始地址,加上偏移地址得到“线性地址”。分页机构把线性地址从高位到低位分解为“页组地址:页地址:页内地址”三部分,由页组地址(页组号)查找“页组表”,获得该页组对应的“页表”首地址。然后用页地址(页号)去查“页表”,得到该页的起始地址,拼接上页内地址,得到“物理地址”。保护模式下也可以关闭分页机构,
15、此时线性地址等于物理地址。1.18 32 位 80X86 和 16 位 80X86 中央处理器的段寄存器有什么不同?答:16 位 80X86CPU 的段寄存器长度为 16 位,存放的是一个段起始地址的高 16 位。32 位 80X86CPU 的段寄存器长度仍然为 16 位,存放的是一个段在“段描述符表”中的序号,表的编号(对每一个程序,有两张段描述符表)和这个段的优先级别。1.19 叙述“保护模式”和“虚拟 8086 方式”之间的关系。答:保护模式是 32 位 80X86MPU 的工作方式,对当前运行的所有任务实施保护。虚拟 8086 方式是保护模式下某一个任务的工作模式,该任务使用类似于实地
16、址方式下的物理地址产生方式,使用 1MB的虚拟内存空间,主要用于运行 8086 程序。欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!1EH30H41H42H43H0FFH00H0CAH0FFH00H0FEH0FFH44H43H0020H002EHXY 习题二 2.1 某数据段内有如下数据定义:X db 30,30H,ABC,2-3,?,11001010B dw 0FFH,-2,“CD”Y dd 20 dup(15,3 dup(?),0)Z db 3 dup(?)W dw Z-X 假设变量 X 的偏移地址为 20H。(1)按照图 2-1 的格式写出
17、变量 X 各数据在内存中的具体位置和相关内存单元的值。(2)写出变量 Y,Z 的偏移地址。(3)写出变量 W 的值 答:(1)变量 X 各数据在内存中的具体位置和相关内存单元的值如右图。(2)变量 Y 的偏移地址为 002EH;变量 Z 的偏移地址为 002EH+4520=01BEH(3)变量 W 的值等于变量 Z和 X 偏移地址之差 01BEH-0020H=019EH 它等于变量 X、Y 所占用内存单元的字节数。2.2 80 x86 指令系统有哪几种类型的指令操作数?比较使用不同类型操作数后的指令长度和指令执行时间。答:80X86 指令系统按照长度划分,有以下四种指令操作数:(1)寄存器操作
18、数,指令短,执行速度快;(2)立即操作数,指令较长,执行速度快;(3)寄存器间接寻址和基址变址寻址表示的内存储器操作数,这类指令长度较短,执行速度较慢(需要访问存储器);(4)直接地址,寄存器相对寻址,相对的基址变址寻址表示的内存储器操作数,这类指令长度较长,执行速度较慢(需要计算物理地址,访问存储器)。2.3 下列指令的源操作数段基址在哪个段寄存器中?(1)MOV AX,BPSI (2)MOV AX,CS:8DI (3)MOV AX,2EBP*1 (4)MOV AX,FS:4ESP (5)MOV AX,2EBPEAX(6)MOV AX,ECXEBP*4 (7)MOC AX,EDXEBP(8)
19、MOV AX,ES:10EBPEAX*2 答:各指令源操作数段基址使用的段寄存器如下:(1)SS(2)CS(3)SS(4)FS (5)SS(6)DS(7)DS(8)ES 2.4 判断下列指令是否正确。若不正确,指出错误原因 (1)MOV AX,EBX (2)MOV SI,DL (3)MOV EBP,ESPEAX*3(4)LEA AX,3006H (5)MOV BPDI,0 (6)MOV SI,DI (7)MOV ES,1000H (8)MOV AX,X+2 (9)MOV AX,CX+2 (10)MOV EAXEAX*2,AL 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们
20、将竭诚为您提供优质的文档!答:(1)指令 MOV AX,EBX 是正确的。(2)指令 MOV SI,DL 是错误的,两个操作数类型不匹配。(3)指令 MOV EBP,ESPEAX*3 是错误的,比例因子不能为 3。(4)指令 LEA AX,3006H 是错误的,LEA 指令的源操作数必须为内存操作数。(5)指令 MOV BPDI,0 是错误的,操作数类型无法确定。(6)指令 MOV SI,DI 是错误的,不能同时出现两个内存操作数。(7)指令 MOV ES,1000H 是错误的,装载段寄存器时,源操作数不能为立即数。(8)如果“X”是用常数表达式定义的符号(例如:X EQU 5+6),或者是用
21、“DW”定义的内存变量,指令 MOV AX,X+2 是正确的。否则这条指令是错误的。(9)指令 MOV AX,CX+2 是错误的,源操作数表达式 CX+2 不是一个可以直接计算的“常数表达式”。(10)指令 MOV EAXEAX*2,AL 是正确的。2.5 现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=0B7H,(21203H)=65H,说明下列指令执行后 AX 寄存器的内容。(1)MOV AX,1
22、200H (2)MOV AX,BX (3)MOV AX,1200H (4)MOV AX,BX (5)MOV AX,1100HBX (6)MOV AX,BXSI (7)MOV AX,1100HBXSI 答:(1)指令 MOV AX,1200H 执行后,(AX)=1200H(立即数操作数)。(2)指令 MOV AX,BX 执行后,(AX)=0100H(寄存器操作数)。(3)指令 MOV AX,1200H 执行后,(AX)=4C2AH(直接地址,EA=1200H)(4)指令 MOV AX,BX 执行后,(AX)=3412H(寄存器间接寻址,EA=0100H)(5)指令 MOV AX,1100HBX
23、执行后,(AX)=4C2AH(相对地址,EA=1200H)(6)指令 MOV AX,BXSI 执行后,(AX)=7856H(基址变址寻址,EA=0102H)(7)指令 MOV AX,1100HBXSI 执行后,(AX)=65B7H(相对基址变址寻址,EA=1202H)2.6 已经定义字符串 MYSTRING 如下:MYSTRING DB A Sample for addressing.用适当的指令把这个字符串的第 5,12 个字符(注:第 0 个字符是A)送入 BX 寄存器。答:可以用如下两条指令完成:MOV BL,MYSTRING5 MOV BH,MYSTRING12 2.7 下面两条指令的
24、功能有什么区别?MOV AX,BX MOV AX,BX 答:指令“MOV AX,BX”把 BX 寄存器的内容装入到 AX 中。指令“MOV AX,BX”把内存储器一个字的内容装入 AX 寄存器。该字的段基址在DS 中,偏移地址在 BX 中。欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!2.8 已经定义数据段如下:DA TA SEGMENT NUM=56 X DB NUM Y DB 27 Z DW 148 DA TA ENDS 指出下列指令中的错误:(1)MOV Y,X (2)MOV BL,04B8H (3)MOV AL,Z (4)MOV BX,3
25、(5)MOV BX,DI (6)MOV DS,DA TA(7)MOV NUM,AX (8)MOV ES,DS(9)MOV AX,FLAGS (10)MOV CS,AX 答:(1)指令 MOV Y,X 同时出现了两个存储器操作数。(2)指令 MOV BL,04B8H 操作数类型不匹配(04B8H 是 16 位立即数,BL 是 8 位 寄存器)。(3)指令 MOV AL,Z 操作数类型不匹配(Z 是 16 位操作数,BL 是 8 位寄存器)。(4)指令 MOV BX,3 操作数类型不能确定。(5)指令 MOV BX,DI 出现了两个存储器操作数。(6)指令 MOV DS,DA TA 不能把立即数装
26、入段寄存器。(7)指令 MOV NUM,AX 立即数不能用作目的操作数。(8)指令 MOV ES,DS 不能在段寄存器之间直接传输。(9)指令 MOV AX,FLAGS 中,FLAGS 寄存器只能隐含在少量指令中使用。(10)指令 MOV CS,AX 中,CS 寄存器不能用作目的操作数。2.9 用适当的指令,把下面字符串 STRING 中的“&”字符用空格代替。STRING DB “The Date is FEB&03”答:可以使用如下指令:MOV STRING15,20H ;20H 是空格的 ASCII 代码 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供
27、优质的文档!习题三 3.1 根据以下要求,写出对应的汇编语言指令(1)把 BX 和 DX 寄存器内容相加,结果存入 DX 寄存器。(2)使用 BX 和 SI 寄存器进行基址变址寻址,把存储器中一字节内容与 AL 内容相加,结果存入存储单元。(3)用寄存器 BX 和位移量 0B2H的寄存器相对寻址方式,把存储器中一个双字与ECX相加,结果存入 ECX。(4)用偏移地址 1020H直接寻址,把存储单元一个字内容与立即数 3 相加,结果存入存储单元。(5)将 AL 寄存器内容与立即数 120 相加,结果存入 AL 寄存器。答:(1)ADD DX,BX (2)ADD BXSI,AL (3)ADD EC
28、X,BX+0B2H (4)ADD WORD PTR1020H,3 (5)ADD AL,120 3.2 求以下各十六进制数与 62A8H 之和,并根据结果写出标志位 SF、CF、ZF、OF 的值。(1)1234H (2)4321H(3)0CFA0H (4)9D60H(5)0FFFFH 答:(1)1234H+62A8H=74DCH SCZO=0000 (2)4321H+62A8H=0A5C9H SCZO=1001 (3)0CFA0H+62A8H=3248H SCZO=0100 (4)9D60H+62A8H=0008H SCZO=0100(5)0FFFFH+62A8H=62A7H SCZO=0100
29、 3.3 求以下各十六进制数与 4AE0H 之差,并根据结果写出标志位 SF、CF、ZF、OF 的值。(1)1234H (2)5D90H(3)9076H (4)0EA04H(5)0FFFFH 答:(1)1234H-4AE0H=0C754H SCZO=1100(2)90H-4AE0H=12B0H SCZO=0000(3)9076H-4AE0H=4597H SCZO=0001 (4)0EA04H-4AE0H=9F24H SCZO=1000 (5)0FFFFH-4AE0H=0B51FH SCZO=1000 3.4 写出执行以下计算的指令序列,其中各变量均为 16 位有符号数。(1)ZW+(Z-X)(
30、2)ZW-(X+6)-(R+9)(3)Z(W*X)/(Y+6),R余数(4)Z(W-X)/(5*Y)*2 解:(1)MOV AX,W MOV BX,Z SUB BX,X ADD AX,BX MOV Z,AX 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!(2)MOV AX,W MOV BX,X ADD BX,6 SUB AX,BX MOV BX,R ADD BX,9 SUB AX,BX MOV Z,AX (3)MOV AX,W IMUL X MOV BX,Y ADD BX,6 IDIV BX MOV Z,AX MOV R,DX (4)MOV AX
31、,Y MOV BX,5 IMUL BX MOV BX,AX MOV AX,W SUB AX,X MOV CX,2 IMUL CX IDIV BX MOV Z,AX 3.5 一个双字长有符号数存放在 DX(高位)AX(低位)中,写出求该数相反数的指令序列。结果仍存入 DX,AX 寄存器 解:NOT DX ;首先将(DX,AX)取反 NOT AX ADD AX,1;最低位加 1,注意:不能用 INC 指令 ADC DX,0;把进位(如果有)传递到高位 3.6 指令 DEC BX 和 SUB BX,1 的执行结果一样吗?请分析。解:指令 DEC BX 和 SUB BX,1 分别执行后,BX 寄存器内
32、的值相同,但是 CF 标志位的状 态可能不同,这是由于 DEC 指令执行后不改变 CF 的状态。3.7 已知内存变量 X,Y,Z 均由“DB”伪操作定义,按照以下要求,使用 MOVZX 或 MOVSX指令进行位数扩展,求三个数的 16b 和。(1)如果 X,Y,Z 为无符号数(2)如果 X,Y,Z 为有符号数 解:(1)MOVZX AX,X MOVZX BX,Y ADD AX,BX MOVZX BX,Z ADD AX,BX 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!(2)MOVSX AX,X MOVSX BX,Y ADD AX,BX MOVS
33、X BX,Z ADD AX,BX 3.8 内存缓冲区 BUFFER 定义如下,按照要求,写出指令序列 BUFFER DB 20 DUP(?)(1)将缓冲区全部置为 0,并使执行时间最短(2)将缓冲区全部置为空格字符(ASCII 代码 20H),使用的指令条数最少(3)将缓冲区各字节依次设置为 0,1,2,3,4,19(4)将缓冲区各字节依次设置为 0,-1,-2,-3,-4,-19(5)将缓冲区各字节依次设置为 30,29,28,27,11(6)将缓冲区各字节依次设置为 0,2,4,6,8,38(7)将缓冲区各字节依次设置为 0,1,2,3,0,1,2,3,3 解:(1)XOR EAX,EAX
34、 MOV DWORD PTR BUFFER,EAX MOV DWORD PTR BUFFER+4,EAX MOV DWORD PTR BUFFER+8,EAX MOV DWORD PTR BUFFER+12,EAX MOV DWORD PTR BUFFER+16,EAX (2)MOV AL,20H MOV CX,20 LEA BX,BUFFER ONE:MOV BX,AL INC BX LOOP ONE (3)XOR BX,BX MOV CX,20 ONE:MOV BUFFERBX,BL INC BX LOOP ONE (4)XOR BX,BX XOR AL,AL MOV CX,20 ONE:
35、MOV BUFFERBX,AL INC BX DEC AL LOOP ONE (5)XOR BX,BX MOV AL,30 MOV CX,20 ONE:MOV BUFFERBX,AL INC BX DEC AL 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!LOOP ONE (6)XOR BX,BX XOR AL,AL MOV CX,20 ONE:MOV BUFFERBX,AL INC BX ADD AL,2 LOOP ONE (7)XOR BX,BX MOV CX,5 ONE:MOV BUFFERBX,0 MOV BUFFERBX+1,1 MO
36、V BUFFERBX+2,2 MOV BUFFERBX+3,3 ADD BX,4 LOOP ONE 3.9 编写循环结构程序,进行下列计算,结果存入 RESULT 内存单元(1)1+2+3+4+5+6+100(2)1+3+5+7+9+11+99(3)2+4+6+8+10+100(4)1+4+7+10+13+100(5)11+22+33+44+99 解:(1)CODE SEGMENT ASSUME CS:CODE RESULT DW?START:XOR AX,AX MOV CX,100 AGAIN:ADD AX,CX LOOP AGAIN MOV RESULT,AX MOV AX,4C00H I
37、NT 21H CODE ENDS END START (2)CODE SEGMENT ASSUME CS:CODE RESULT DW?START:XOR AX,AX MOV CX,50 MOV BX,1 AGAIN:ADD AX,BX 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!ADD BX,2 LOOP AGAIN MOV RESULT,AX MOV AX,4C00H INT 21H CODE ENDS END START (3)CODE SEGMENT ASSUME CS:CODE RESULT DW?START:XOR AX,AX MO
38、V CX,50 MOV BX,2 AGAIN:ADD AX,BX ADD BX,2 LOOP AGAIN MOV RESULT,AX MOV AX,4C00H INT 21H CODE ENDS END START (4)CODE SEGMENT ASSUME CS:CODE RESULT DW?START:XOR AX,AX MOV CX,34 MOV BX,1 AGAIN:ADD AX,BX ADD BX,3 LOOP AGAIN MOV RESULT,AX MOV AX,4C00H INT 21H CODE ENDS END START (5)CODE SEGMENT ASSUME CS
39、:CODE RESULT DW?START:XOR AX,AX MOV CX,9 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!MOV BX,11 AGAIN:ADD AX,BX ADD BX,11 LOOP AGAIN MOV RESULT,AX MOV AX,4C00H INT 21H CODE ENDS END START 3.10 已知 ARRAY 是 5 行 5 列的有符号字数组,编写程序,进行下列计算(假设和仍然为 16b,不会产生溢出)(1)求该数组第 4 列所有元素之和(列号从 0 开始)(2)求该数组第 3 行所有元素之和(行号
40、从 0 开始)(3)求该数组正对角线上所有元素之和(4)求该数组反对角线上所有元素之和 解:假设数据段已定义如下:DA TA SEGMENT ARRAY DW 1,6,9,23,12 ;定义数组 ARRAY DW 54,23,15,-92,37 ;每一行 5 个数据 DW -99,231,76,81,90 ;共 5 行 DW 33,67,81,-99,0 ;共计 25 个数据 DW 123,-52,77,-180,89 SUM DW?;SUM 存放结果 DA TA ENDS (1)CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DA TA M
41、OV DS,AX MOV AX,0 ;累加器在循环之前清零 MOV CX,5 ;计数器置初值 MOV SI,4*2 ;第 1 行第 4 列元素在数组内的位移 NEXT:ADD AX,ARRAYSI ADD SI,5*2 ;SI 指向下一行第 4 列元素 LOOP NEXT MOV SUM,AX MOV AX,4C00H INT 21H CODE ENDS END START (2)CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DA TA MOV DS,AX 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优
42、质的文档!MOV AX,0 ;累加器在循环之前清零 MOV CX,5 ;计数器置初值 MOV SI,3*5*2 ;第 3 行第 0 列元素在数组内的位移 NEXT:ADD AX,ARRAYSI ADD SI,2 ;SI 指向本行下一列元素 LOOP NEXT MOV SUM,AX MOV AX,4C00H INT 21H CODE ENDS END START (3)CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DA TA MOV DS,AX MOV AX,0 ;累加器在循环之前清零 MOV CX,5 ;计数器置初值 MOV SI,0 ;第
43、 0 行第 0 列元素在数组内的位移 NEXT:ADD AX,ARRAYSI ADD SI,5*2+2 ;SI 指向正对角线上下一个元素 LOOP NEXT MOV SUM,AX MOV AX,4C00H INT 21H CODE ENDS END START (4)CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DA TA MOV DS,AX MOV AX,0 ;累加器在循环之前清零 MOV CX,5 ;计数器置初值 MOV SI,4*2 ;第 0 行第 4 列元素在数组内的位移 NEXT:ADD AX,ARRAYSI ADD SI,(5-
44、1)*2 ;SI 指向反对角线上下一个元素 LOOP NEXT MOV SUM,AX MOV AX,4C00H INT 21H CODE ENDS END START 3.11 编写程序,利用公式:N2=1+3+5+(2N-1)计算 N2的值,假设 N=23。解:DA TA SEGMENT 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!N DW 23 SQUARE DW?;存放结果 DA TA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DA TA MOV DS,AX MOV CX
45、,N ;循环计数器置初值 XOR AX,AX ;累加器清零 MOV BX,1 ;数列第一项 ONE:ADD AX,BX ADD BX,2 LOOP ONE MOV SQUARE,AX MOV AX,4C00H INT 21H CODE ENDS END START 3.12 变量 X,Y,Z 均为一字节压缩 BCD 码表示的十进制数,写出指令序列,求它们的和(用2 字节压缩 BCD 码表示)。解:XOR AX,AX ;清 AX,用于存放 2 字节结果 MOV AL,X ADD AL,Y ;完成 X+Y DAA ;压缩 BCD 码加法调整 ADC AH,0 ;把可能的进位收集到 AH 中 ;AH
46、 中最大的可能值为 2,因此不需要 BCD 加法调整 ADD AL,Z ;完成 X+Y+Z DAA ;压缩 BCD 码加法调整 ADC AH,0 ;把可能的进位收集到 AH 中 ;计算完成,结果(2 字节压缩 BCD 码)在 AX 中 3.13 数组 LIST1 内存有 20 个非压缩 BCD 码表示的单字节十进制数,写出完整程序,求这20 个 BCD 数之和,结果(非压缩 BCD 码)存入 SUM1 双字单元。解:CODE SEGMENT ASSUME CS:CODE LIST1 DB 6705762998;20 个非压缩 BCD 数 DB 4322687310 SUM1 DD?;存放结果(
47、20 个数之和)START:XOR AX,AX ;累加器清零 MOV CX,20 ;循环计数器置初值 LEA BX,LIST1;地址指针置初值 ONE:ADD AL,CS:BX;加入一个非压缩 BCD 数 AAA ;调整,结果在 AH(百位、十位),AL(个位)中 INC BX ;修改指针 LOOP ONE ;循环控制 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!MOV BYTE PTR SUM1,AL;保存个位 MOV AL,AH MOV AH,0 ;百位、十位(二进制)存入 AX AAM ;分解百位到 AH,十位到 AL MOV WORD
48、PTR SUM1+1,AX;保存百位、十位 MOV BYTE PTR SUM1+3,0 ;千位清零(和最大为 9*20=180)MOV AX,4C00H INT 21H CODE ENDS END START 3.14 数组 LIST2 内存有 20 个压缩 BCD 码表示的单字节十进制数,写出完整程序,求这 20个 BCD 数之和,结果(压缩 BCD 码)存入 SUM2 双字单元。解:CODE SEGMENT ASSUME CS:CODE LIST2 DB 12H,34H,56H,15H,82H,52H,48H,19H,31H,63H DB 22H,33H,44H,55H,66H,77H,8
49、8H,99H,11H,39H SUM2 DD?START:XOR AX,AX ;累加器清零 XOR BX,BX ;地址指针置初值 MOV CX,20 ;循环计数器置初值 ONE:ADD AL,LIST2BX;加入一个压缩 BCD 数 DAA ;调整 XCHG AH,AL ;交换 AH 和 AL ADC AL,0 ;收集进位(百位、千位)DAA ;高位(百位、千位)调整 XCHG AH,AL ;恢复 AH 和 AL ;(AH)=千位、百位,(AL)=十位、个位 INC BX ;修改指针 LOOP ONE ;循环控制 MOV WORD PTR SUM2,AX;保存千、百、十、个位 MOV WORD
50、 PTR SUM2+2,0;高位清零 MOV AX,4C00H INT 21H CODE ENDS END START 3.15 数组 LIST3 内存有 20 个压缩 BCD 码表示的双字节十进制数,写出完整程序,求这 20 个 BCD 数之和,结果(压缩 BCD 码)存入 SUM3 双字单元。解:CODE SEGMENT ASSUME CS:CODE LIST3 DW 1234H,3456H,5678H,1523H,8263H,DW 5234H,4856H,1926H,3177H,6389H DW 2211H,3322H,4433H,5544H,6655H DW 7766H,8877H,9