首页 微机原理与接口技术(楼顺天版)课后习题答案14章

微机原理与接口技术(楼顺天版)课后习题答案14章

举报
开通vip

微机原理与接口技术(楼顺天版)课后习题答案14章微机原理与接口技术(楼顺天版)课后习题答案14章 普通高等教育“十一五”国家级规划教材 微机原理与接口技术 [课后习题答案] [楼顺天 周佳社]编著 [科学出版社2010年6月第六次印刷版] 目录 第1章 数制与码制 ........................................................................ 2 第2章 8086 CPU结构与功能) .....................................................

微机原理与接口技术(楼顺天版)课后习题答案14章
微机原理与接口技术(楼顺天版)课后习 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 答案14章 普通高等教育“十一五”国家级规划教材 微机原理与接口技术 [课后习题答案] [楼顺天 周佳社]编著 [科学出版社2010年6月第六次印刷版] 目录 第1章 数制与码制 ........................................................................ 2 第2章 8086 CPU结构与功能) .................................................. 7 第3章 数制与码制 ................................................................... 9 第4章 汇编语言程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 .......................................................... 24 , 1 , 第1章 数制与码制 1. 将下列十进制数转换成二进制数: (1)58;(2)67.625; (3)5721; 解:(1) 58D = 0011 1010B (2) 67.625D = 0100 0011.1010B (3) 5721D = 0001 0110 0101 1001B 2. 将二进制数变换成十六进制数: (1)1001 0101B; (2)11 0100 1011B; (3)1111 1111 1111 1101B; (4)0100 0000 10101B;(5)0111 1111B; (6)0100 0000 0001B 解: (1)1001 0101B = 95H (2)11 0100 1011B = 34BH (3)1111 1111 1111 1101B = FFFDH (4)0 1000 0001 0101B = 815H (5)0111 1111B = 7FH (6)0100 0000 0001B = 401H 3. 将十六进制数变换成二进制数和十进制数: 1)78H; (2)0A6H; (3)1000H; (4)0FFFFH ( 解:(1)78H = 120D = 0111 1000B (2)0A6H = 166D = 1010 0110B (3)1000H = 4096D = 0001 0000 0000 0000H (4)0FFFFH = 65535D = 1111 1111 1111 1111B 4. 将下列十进制数转换成十六进制数: (1)39; (2)299.34375; (3)54.5625 解:(1)39D = 27H (2)299.34375D = 12B.58H (3)54.5625D = 36.9H 5. 将下列二进制数转换成十进制数: (1)10110.101B; (2)10010010.001B; (3)11010.1101B 解:(1)10110.101B = 22.625D , 2 , (2)10010010.001B = 146.125D (3)11010.1101B = 26.8125D 6. 计算(按原进制运算): (1)10001101B,11010B; (2)10111B,11100101B; (3)1011110B,1110B; (4)124AH,78FH; (5)5673H,123H; (6)1000H,F5CH; 解:(1)10100111B (2) 11111100B 3)1010000B ( (4)19D9H 5)5796H ( (6)A4H 7. 已知a=1011B, b=11001B, c=100110B, 按二进制完成下列运算,并用十进制运算检查 计算结果: (1)a+b; (2)c-a-b; (3)a×b; (4)c?b 解:a=1011B=11D b=11001B=25D c=100110B =38D (1)100100B = 36D (2)10B = 2D (3)1 0001 0011B=275D (4)1B 余1101B= 13D 8. 已知a=00111000B, b=11000111B, 计算下列逻辑运算: (1)a AND b; (2)a OR b; (3)a XOR b; (4)NOT a 解:(1)00000000B (2)11111111B (3)11111111B (4)11000111B 9. 设机器字长为8位,写出下列各数的原码和补码: (1)+1010101B;(2)-1010101B;(3)+1111111B; (4)-1111111B;(5)+1000000B;(6)-1000000B 解:(1)原01010101B 补01010101B (2)原11010101B 补10101011B , 3 , (3) 原01111111B 补01111111B (4) 原11111111B 补10000001B (5) 原01000000B 补01000000B (6) 原11000000B 补11000000B 10. 写出下列十进制数的二进制补码表示(设机器字长为8位): (1)15;(2),1;(3)117;(4)0; (4),15;(5)127;(6),128;(7)80 ) (00001111B)补 解:(1 (2) (11111111B)补 3) (01110101B)补 ( (4) (00000000B)补 (5) (11110001B)补 (6) (01111111B)补 (7) (10000000B)补 (8) (01010000B)补 11. 设机器字长为8位,先将下列各数表示成二进制补码,然后按补码进行运算,并用十进 制数运算进行检验: (1)87,73;(2)87,(,73);(3)87,(,73); (4)(,87),73;(5)(,87),73;(6)(,87),(,73); 解:(1)1110B=14D (2)00001110B 进位舍弃 (3)10100000B=-96D 溢出 (4)11110010B=-14D (5)01100000B=96D 溢出 (6)11110010B=-14D 12. 已知a,b,c,d为二进制补码:a=00110010B, b=01001010B, c=11101001B, d=10111010B, 计算: (1)a+b;(2)a+c;(3)c+b;(4)c+d; (5)a-b;(6)c-a;(7)d-c;(8)a+d-c 解:(1)01111100B , 4 , (2)00011011B (3)00110011B (4)10100011B (5)11101000B (6)10110111B (7)11010001B (8)11B -b,并判断其结果是否13. 设下列四组为8位二进制补码表示的十六进制数,计算a+b和a 溢出: (1)a=37H, b=57H; (2)a=0B7H, b=0D7H; (3)a=0F7H, b=0D7H; (4)a=37H, b=0C7H 解:(1)a+b=8EH溢出,a-b=E0H未溢出 (2)8EH未溢出,E0H未溢出 (3)CEH未溢出,20H未溢出 (4)FEH未溢出70H未溢出 14. 求下列组合BCD数的二进制和十六进制表示形式: (1)3251(2)12907(3)2006 解:(1)0011 0010 0101 0001B = 3251H (2)0001 0010 1001 0111B = 12907H (3)0010 0000 0000 0110B = 2006H 15. 将下列算式中的十进制数表示成组合BCD码进行运算,并用加6/减6修正其结果: (1)38,42;(2)56,77;(3)99,88;(4)34,69; (5)38,42;(6)77,56;(7)15,76;(8)89,23 解:(1) 0011 1000B + 0100 0010B = 0111 1010B 低BCD码位需要加6修正 0111 1010B + 0000 0110B = 1000 0000B = 80BCD (2) 0101 0110B + 0111 0111B = 1100 1101B 高、低BCD码位都需要加6修正 1100 1101B + 0110 0110B = 0001 0011 0011B=133BCD (3) 1001 1001B+1000 1000B = 0001 0010 0001B 高、低BCD码位都需要加6修正 0001 0010 0001B +0110 0110B = 0001 1000 0111B=187BCD (4) 0011 0100B + 0110 1001B = 1001 1101B 低BCD码位需要加6修正 , 5 , 1001 1101B + 0000 0110B = 1010 0011B 修正结果使高BCD码位需要加6修正 1010 0011B +0110 0000B = 0001 0000 0011B = 103BCD (5) 00111000B-01000010B =(-1)1111 0110B 高 BCD码位需要减6修正 (-1)1111 0110B -0110 0000B =(-1)1001 0110B=-100+96=-4BCD (6)01110111B-01010110B = 0010 0001B = 21BCD (7) 00011001B-01110110B =(-1)1001 1111B 高、低BCD码位都需要减6修正 (-1)1001 1111B -01100110B =(-1)0011 1001B = -100+39 = -61BCD 8)10001001B-00100011B = 0110 0110B = 66BCD ( 16. 将下列字符串表示成相应的ASCII码(用十六进制数表示): (1)Example 1;(2)XiDian University;(3)-108.652; (4)How are you?;(5)Computer(6)Internet Web 解:(1)45H,78H,61H,6DH,70H,6CH,65H,20H,31H (2) 58H,69H,44H,69H,61H,6EH,20H,55H,6EH,69H,76H,65H,72H,73H,69H,74H,79H (3)2DH,31H,30H,38H,2EH,36H,35H,32H (4)48H,6FH,77H,20H,61H72H,65H,20H79H,6FH,75H (5)43H,6FH,6DH,70H,75H,74H,65H,72H (6)49H,6EH,74H,65H72H,6EH,65H,74H,20H,57H,65H,62H 17. 将下列字符串表示成相应的ASCII码(用十六进制数表示): (1)Hello(2)123456;(注:表示回车)(3)ASCII; (4)The number is 2315 解:(1)48H,65H,6CH,6CH,6FH (2)31H,32H,33H,0DH,34H,35H,36H (3)41H,53H,43H,49H,49H (4)54H,68H,65H,20H,6EH,75H,6DH,62H,65H,72H , 6 , 第2章 8086 CPU结构与功能 1. 微处理器内部结构由哪几部分组成,阐述各部分的主要功能。 解:微处理器内部结构由四部分组成: (1)算术逻辑运算单元ALU:完成所有的运算操作; (2)工作寄存器:暂存寻址信息和计算过程中的中间结果; (3)控制器:完成指令的读入、寄存和译码,并产生控制信号序列使ALU完成指定操 作; (4)I/O控制逻辑:处理I/O操作。 2. 微处理器级总线有哪几类,各类总线有什么作用, 解:微处理器级总线有三类: (1)数据总线:传送信息; (2)地址总线:传送地址码; (3)控制总线 传送控制信号。 3. 为什么地址总线是单向的,而数据总线是双向的, 解:地址码只能由CPU生成。而数据需要在CPU和存储器之间传输。 4. 8086/8088微处理器内部有哪些寄存器,其主要作用是什么, 解:8086CPU内部有14个16位寄存器,其中8个通用寄存器(4数据寄存器AX、BX、 CX、DX,4地址指针/变址寄存器SI、DI、SP、BP),4个段寄存器(CS、DS、ES、SS), 2个控制寄存器(指令指针IP,微处理器状态字PSW)。 应该注意的是:可以在指令中用作为地址指针的寄存器有:SI、DI、BP和BX;在微处理 器状态字PSW中,一共设定了9个标志位,其中6个标志位用于反映ALU前一次操 作的结果状态(CF,PF,AF,ZF,SF,OF),另3个标志位用于控制CPU操作(DF, IF,TF)。 5. 如果某微处理器有20条地址总线和16条数据总线: (1)假定存储器地址空间与I/O地址空间是分开的,则存储器地址空间有多大, (2)数据总线上传送的有符号整数的范围有多大, 2021,MB解:(1)存储器地址空间为: 1515,,2~21 (2)有符号数范围为: , 即 ,32768,32767 6. 将十六进制数62A0H与下列各数相加,求出其结果及标志位CF、AF、SF、ZF、OF , 7 , 和PF的值: (1) 1234H;(2) 4321H;(3) CFA0H;(4) 9D60H 解:(1) 74D4H CF=0 AF=0 SF=0 ZF=0 OF=0 PF=1 (2) A5C1H CF=0 AF=0 SF=1 ZF=0 OF=1 PF=0 (3) 3240H CF=1 AF=0 SF=0 ZF=0 OF=0 PF=0 (4) 0000H CF=1 AF=0 SF=0 ZF=1 OF=0 PF=1 7. 从下列各数中减去4AE0H,求出其结果及标志位CF、AF、SF、ZF、OF和PF的值: (1)1234H;(2)5D90H;(3)9090H;(4)EA04H 解:(1) C754H CF=1 AF=0 SF=1 ZF=0 OF=0 PF=0 2) 12B0H CF=0 AF=0 SF=0 ZF=0 OF=0 PF=0 ( (3) 45B0H CF=0 AF=0 SF=0 ZF=0 OF=1 PF=0 (4) 9F24H CF=0 AF=0 SF=1 ZF=0 OF=0 PF=1 9. 写出下列存储器地址的段地址、偏移地址和物理地址: (1)2134:10A0;(2)1FA0:0A1F;(3)267A:B876 解:物理地址,段地址*10H+偏移地址 (1)段地址:2134H,偏移地址:10A0H,物理地址:223E0H (2)段地址:1FA0H,偏移地址:0A1FH,物理地址:2041FH (3)段地址:267AH,偏移地址:B876H,物理地址:32016H 10. 给定一个数据的有效地址为2359H,并且(DS),490BH,求该数据的物理地址。 解:物理地址,段地址*10H+偏移地址 物理地址,490BH ,2359H , 4B409H 11. 如果在一个程序段开始执行之前,(CS),0A7F0H,(IP),2B40H,求该程序段的第 一个字的物理地址。 解:物理地址,段地址*10H+偏移地址 物理地址,CS*10H+IP = AAA40H 12. IBM PC有哪些寄存器可用来指示存储器的地址, 解:变址寄存器SI,DI,堆栈指针SP,BP,另外还有BX。 , 8 , 第3章 8086CPU指令系统 1. 写出完成下列要求的变量定义语句: (1)在变量var1中保存6个字变量:4512H,4512,,1,100/3,10H,65530; (2)在变量var2中保存字符串:’BYTE’, ’word’, ’WORD’; (3)在缓冲区buf1中留出100个字节的存储空间; (4)在缓冲区buf2中,保存5个字节的55H,再保存10个字节的240,并将这一过程 重复7次; (5)在变量var3中保存缓冲区buf1的长度; (6)在变量pointer中保存变量var1和缓冲区buf1的偏移地址。 解:var1 DW 4512H,4512,-1,100/3,10H,65530 var2 DB ’BYTE’,’word’,’WORD’ buf1 DB 100 DUP(?) buf2 DB 7 DUP(5 DUP(55H),10 DUP(240)) var3 DB LENGTH buf1 pointer DW var1,buf1 (或者pointer DW OFFSET var1,OFFSET buf1) 2. 设变量var1的逻辑地址为0100:0000,画出下列语句定义的变量的存储分配图: var1 DB 12,,12,20/6,4 DUP(0,55H) var2 DB ‘Assemble’ var3 DW ‘AB’, ‘cd’, ‘E’ var4 DW var2 var5 DD var2 解: , 9 , 3. 指令正误判断,对正确指令写出源和目的操作数的寻址方式,对错误指令指出原因(设 VAR1, VAR2为字变量, L1为标号): 1)MOV SI,100 (2)MOV BX,VAR1[SI] ( (3)MOV AX, [BX] (4)MOV AL, [DX] (5)MOV BP, AL (6)MOV VAR1, VAR2 (7)MOV CS, AX (8)MOV DS, 0100H (9)MOV [BX][SI], 1 (10)MOV AX, VAR1+VAR2 (11)ADD AX, LENGTH VAR1 (12)OR BL, TYPE VAR2 (13)SUB [DI], 78H (14)MOVS VAR1, VAR2 (15)PUSH 100H (16)POP CS (17)XCHG AX, ES (18)MOV DS, CS (19)JMP L1+5 (20)DIV AX, 10 (21)SHL BL, 2 (22)MOV AL, 15+23 (23)MUL CX (24)XCHG CL, [SI] (25)ADC CS:[0100], AH (26)SBB VAR1,5,154 解:(1)MOV SI,100 正确。源:立即数寻址, 目的:寄存器寻址 (2)MOV BX,VAR1[SI] 正确。源:寄存器相对寻址, 目的:寄存器寻址 (3)MOV AX,[BX] 正确。源:寄存器间接寻址,目的:寄存器寻址 (4)MOV AL,[DX] 错误。寄存器间接寻址时,DX, AX, CX不能作地址寄存器 (5)MOV BP,AL 错误。操作数类型不一致 (6)MOV VAR1,VAR2 错误。两存储单元之间不能用MOV指令传送数据 , 10 , (7)MOV CS,AX 错误。CS不能为目的操作数 (8)MOV DS,0100H 错误。目的操作数为段寄存器时,源操作数不能为立即数 (9)MOV [BX][SI],1 错误。指令类型不定。 (10)MOV AX,VAR1+VAR2 错误。MOV指令中不能完成加法运算 (11)ADD AX,LENGTH VAR1 正确。源:立即数寻址。目的:寄存器寻址 (12)OR BL,TYPE VAR2 正确。源:立即数寻址。目的:寄存器寻址 (13)SUB [DI],78H 错误。指令类型不定 14)MOVS VAR1,VAR2 正确。目的、源均为隐含寻址。操作数仅指出操作数类型 ( (15)PUSH 100H 错误。将常数压入堆栈,要通过寄存器来实现 16)POP CS 错误。目的操作数不能为CS ( (17)XCHG AX,ES 错误。XCHG指令的操作数不能是段寄存器 (18)MOV DS,CS 错误。MOV指令不能从段寄存器到段寄存器 (19)JMP L1+5 正确。段内直接转移 (20)DIV AX,10 错误。指令格式错误。 (21)SHL BL,2 错误。移位指令的移位数为1或者CL (22)MOV AL,15+23 正确。源:立即数寻址,目的:寄存器。编译时就处理为38 (23)MUL CX 正确。源:寄存器寻址,目的:寄存器寻址 (24)XCHG CL,[SI] 正确。源:寄存器间接寻址,目的:寄存器寻址 (25)ADC CS:[0100],AH 正确。源:寄存器寻址,目的: 直接寻址(数据在代码段中) (26)SBB VAR1-5,154 正确。源:立即数寻址,目的:直接寻址。 4. 说明下列指令对的区别: (1)MOV AX,VAR1 与 MOV AX,OFFSET VAR1 (2)MOV AX,VAR2 与 LEA AX,VAR2 (3)MOV AL,LENGTH VAR1 与 MOV AL,SIZE VAR1 (4)MOV AL,ES: [DI] CMP AL, [SI] 与 CMPSB (5)SHR AL,1 与 SAR AL,1 (6)SHR AL,1 与 ROR AL,1 (7)ROL BX,1 与 RCL BX,1 解:(1)MOV AX,VAR1 把变量VAR1对应地址单元中的一个字送入AX MOV AX,OFFSET VAR1 把VAR1的有效地址的偏移地址送入AX , 11 , (2)MOV AX,VAR2 把变量VAR2对应地址单元中的一个字送入AX LEA AX,VAR2 把VAR2的有效地址的偏移地址送入AX (3)MOV AL,LENGTH VAR1 把变量VAR1的长度送入AL MOV AL,SIZE VAR1 把变量VAR1的大小送入AL (4)MOV AL,ES:[DI] CMP AL,[SI] 把以ES为段地址,DI为偏移地址的一个字节送入AL, 并与以SI内容为偏移地址的一个字节作比较,改变标志寄 DS: (SI)内容比较) 存器内容。(相当于作ES:(DI)与( CMPSB 对字符串中的一字节比较。寻址方式隐含。源串的地址由 DS:SI指定,目的串的地址由ES:DI指定。(相当于作 SI)与ES:(DI)内容比较) DS: ( (5)SHR AL,1 AL逻辑右移1位,最高位移入0, 最低位移入CF。 SAR AL,1 AL算术右移1位,以最高位内容移入,最低位移入CF, 其余各位 右移一位。 (6)SHR AL,1 AL逻辑右移1位,最高位移入0, 最低位移入CF。 ROR AL,1 AL的各位构成环形移位,右移一位,最低位内容同时移入到CF和 最高位。 (7)ROL BX,1 BX各位构成环形移位,左移一位,最高位内容同时移入到CF和 最低位。 RCL BX,1 BX和CF构成环形移位,左移一位,CF内容移入到最低位,最 高位移入CF。 5. 写出下列转移指令的寻址方式(设L1为标号,VAR1为字型变量,DVAR1为双字型变量): (1)JMP L1 (2)JMP NEAR L1 (3)JNZ L1 (4)JMP BX (5)JG L1 (6)JMP VAR1[SI] (7)JMP FAR PTR L1 (8)JMP DVAR1 解:(1)JMP L1 段内直接寻址 (2)JMP NEAR PTR L1 段内直接寻址 (3)JNZ L1 段内直接寻址 (4)JMP BX 段内间接寻址 (5)JG L1 段内直接寻址 (6)JMP VAR1[SI] 段内间接寻址 (7)JMP FAR PTR L1 段间直接寻址 (8)JMP DVAR1 段间间接寻址 , 12 , 6. 设(DS),2000H,(BX),0100H,(SI),0002H,(20100),3412H,(20102),7856H, (21200),4C2AH,(21202),65B7H,求下列指令执行后AX寄存器的内容: (1)MOV AX,1200H; (2)MOV AX,BX; (3)MOV AX, [1200H]; (4)MOV AX, [BX]; (5)MOV AX,1100[BX];(6)MOV AX, [BX][SI]; (7)MOV AX,1100[BX][SI] 解:(1)1200H (2) 0100H (3)4C2AH (4)3412H (5)4C2AH (6)7856H (7)65B7H 7. 执行下列指令后,DX寄存器中的内容是多少, TABLE DW 25,36,,1,,16,10000,13 DW 7 PYL „„ MOV BX,OFFSET TABLE ADD BX,PYL MOV DX,[BX] 解:DX = 10FFH 由-16(FFF0H)的高8位和10000(2710H)的低8位构成 8. 如果堆栈的起始地址为2200:0000,栈底为0100H,(SP),00A8H,求 (1)栈顶地址; (2)SS的内容; (3)再存入数据5678H,3AF2H后,SP的内容。 解:栈顶地址 00A8H, SS = 2200H, 再存入2个字后,SP = 00A4H 9. 设已用伪指令EQU定义了4个标识符: N1 EQU 2100 N2 EQU 10 N3 EQU 20000 N4 EQU 25000 下列指令是否正确,并说明原因。 (1)ADD AL,N1,N2; (2)MOV AX,N3,N4; (3)SUB BX,N4,N3; (4)SUB AH,N4,N3,N1; (5)ADD AL,N2; (6)MOV AH,N2*N2 解:(1)错误。N1-N2=2090>255 (2)正确 (3)正确 , 13 , (4)错误。N4-N3-N1=2900>255 (5)正确 (6)正确 10. 按下列要求写出指令: 1)将AX寄存器的低4位清零,其余位不变; ( (2)将BX寄存器的低4位置1,其余位不变; (3)将AL寄存器的低4位保持不变,高4位取反; (4)测试BX中的位1和位2,当这两位同时为0时将AL置0FFH,否则AL清零; (5)测试BX中的位1和位2,当这两位有一位为0时将AL置0FFH,否则AL清零; 6)将AL中保存的字母ASCII码变换成相应的大写字母的ASCII码; ( (7)将AL中保存的字母ASCII码变换成相应的小写字母的ASCII码; 8)将AX中的各位取反; ( (9)将DX中的低7位取反,高9位不变; (10)将CX中的低8位与高8位互换。 解:(1)AND AX,0FFF0H (2)OR BX,000FH (3)XOR AL,0F0H (4) TEST BX,06H (5) MOV AX,BX JZ ZERO AND AX,06H MOV AL,00H XOR AX,06H JMP OVER JZ OVER ZERO: MOV AL,0FFH MOV AL,0FFH OVER: OVER: (6)AND AL,5FH 或者: CMP AL,61H JL OVER (无需变换或不是字母) CMP AL,7AH JG OVER (不是字母) AND AL,5FH 或 SUB AL,20H OVER: , 14 , (7)OR AL,20H 或者: CMP AL,41H JL OVER (不是字母) CMP AL,5AH JG OVER (无需变换或不是字母) 20H 或 ADD AL,20H OR AL, OVER: 8)XOR AX,0FFFFH 或者 NOT AX ( (9)XOR DX,007FH (10)XCHG CH,CL 11. 写出完成下述功能的程序段: (1)传送40H到AL寄存器; (2)将AL的内容乘以2; (3)传送16H到AH寄存器; (4)AL的内容加上AH的内容。 计算最后结果(AL),, 解:(1)MOV AL,40H (2)SHL AL,1 (3)MOV AH,16H (4)ADD AL,AH AL=96H 12. 写出完成下述功能的程序段: (1)从缓冲区BUF的0004偏移地址处传送一个字到AX寄存器; (2)将AX寄存器的内容右移2位; (3)将AX内容与BUF的0006偏移地址处的一个字相乘; (4)相乘结果存入BUF的0020H偏移地址处(低位在前)。 解: (1) LEA SI, BUF , 15 , MOV AX, [SI+4] (2) SHR AX,1 SHR AX,1 (3) MUL WORD PTR 6[SI] (4) MOV 20H[SI],AX MOV 22H[SI],DX 13. 设(BX),11001011B,变量VAR的内容为00110010B,求下列指令单独执行后BX的内 容: (1)XOR BX,VAR; (2)AND BX,VAR; 3)OR BX,VAR; (4)XOR BX,11110000B; ( (5)AND BX,00001111B; (6)TEST BX,1 解:(1)00F9H (2)0002H (3)00FBH (4)003BH (5)000BH (6)00CBH 14. 设(DX),10111011B,(CL),3,(CF),1,求下列指令单独执行后DX的内容: (1)SHR DX,1; (2)SAR DX,CL; (3)SHL DX,CL; (4)SHL DX,1; (5)ROR DX,CL; (6)ROL DL,CL; (7)SAL DH,1; (8)RCL DX,CL; (9)RCR DL,1 解:DX= 0000 0000 1011 1011B CF=1 CL=3 (1)SHR DX,1 DX逻辑右移1 0000 0000 0101 1101B = 005DH (2)SAR DX,CL DX算术右移3 0000 0000 0001 0111B = 0017H (3)SHL DX,CL DX逻辑左移3 0000 0101 1101 1000B = 05D8H (4)SHL DX,1 DX逻辑左移1 0000 0001 0111 0110B = 0176H (5)ROR DX,CL DX循环右移3 0110 0000 0001 0111B = 6017H (6)ROL DL,CL DL循环左移3 0000 0000 1101 1101B = 00DDH (7)SAL DH,1 DH算术左移1 0000 0000 1011 1011B = 00BBH (8)RCL DX,CL DX带进位循环左移3 0000 0101 1101 1100B = 05DCH , 16 , (9)RCR DL,1 DL带进位循环右移1 0000 0000 1101 1101B = 00DDH 15. 选择题(各小题只有一个正确答案) 1)执行下列三条指令后: ( MOV SP,1000H PUSH AX CALL BX a. (SP),1000H; b. (SP),0FFEH; ),1004H; d. (SP),0FFCH; c. (SP (2)要检查寄存器AL中的内容是否与AH相同,应使用的指令为: a. AND AL, AH b. OR AL, AH c. XOR AL, AH d. SBB AL, AH (3)指令JMP NEAR PTR L1与CALL L1(L1为标号)的区别在于: a. 寻址方式不同; b. 是否保存IP的内容; c. 目的地址不同; d. 对标志位的影响不同。 解:(1)D PUSHU AX则AX入栈,SP=0FFEH;CALL BX则IP入栈,SP=0FFCH (2)C 异或,若相同,则AL=0,ZF,1。 (3)B 16. 寄存器DX:AX组成32位数,DX为高位,编写程序段实现: (1)DX:AX右移3位,并将移出的低3位保存在CL中; (2)DX:AX左移3位,并将移出的高3位保存在CL中; 解:(1)移出的3位应该按时序移入CL中。 XOR CL,CL MOV BL,3 L1: SHR DX,1 RCR AX,1 RCL CL,1 DEC BL JNZ L1 (2)移出的3位应该按时序移入CL中。 XOR CL,CL , 17 , MOV BL,3 L1: SHL AX,1 RCL DX,1 RCL CL,1 DEC BL JNZ L1 17. 编写程序段实现将BL中的每一位重复4次,构成32位的双字DX:AX,例如当BL 01011101B时,则得到的(DX),0F0FH,(AX),0FF0FH。 , 解:算术右移时,移入的值就是最高位本身,这样可以使位内容重复,利用这一点可以实现 题目的要求。 XOR DX,DX XOR AX,AX MOV CX,4 L1: SHR BL,1 RCR AX,1 SAR AX,1 SAR AX,1 SAR AX,1 LOOP L1 MOV CX,4 L2: SHR BL,1 RCR DX,1 SAR DX,1 SAR DX,1 SAR DX,1 LOOP L2 18. 字变量VAR1中保存有小于38250的16位无符号数,编写程序段实现VAR1?150,并 进行四舍五入操作,将商保存在字节变量VAR2中。 解:根据题意,38250?150,255,因此商不会超过255,可以用一个字节表示。 a?b的四舍五入操作可以通过判断除后余数实现:余数大于等于除数的一半,则商加1; , 18 , 否则不用加1。但这种 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 用汇编语言编程实现时比较复杂,这里介绍另外一种方法:设a?b的四舍五入后的结果为c,用『』表示取整数操作,则 b,,a,a,,2,, c,,,0.5,,bb,,,,,, 这种方法是在除法操作之前,在被除数上加上除数的一半,这样除法操作后得到的值就是考虑了四舍五入的商。 VAR1 DW 12345 VAR2 DB ? DATAA DB 150 MOV AX,VAR1 XOR BX,BX MOV BL,DATAA SHR BX,1 ADD AX,BX DIV DATAA MOV VAR2,AL 19. 有一组无符号的16位数据保存在BUFFER中,前两个字节存放数据的个数,编程实现 按下式进行滤波处理: 1ykxkxkxkk()()(1)(2)2,,,,,,,, 3 ykxkk()()2,, 解:滤波结果保存在FILT中。 BUFFER DW 0CH DW 33H, 18H, 1BH, 06H, 33H, 08H DW 3H, 6H, 0FH, 51H, 05H, 0CH FILT DW 100H DUP(?) LEA SI,BUFFER LEA DI,FILT , 19 , MOV CX,[SI] MOV [DI],CX ADD SI,2 ADD DI,2 XOR DX,DX MOV AX,[SI] MOV [DI],AX MOV BX,2[SI] MOV 2[DI],BX ADD SI,4 ADD DI,4 DEC CX DEC CX ADD AX,BX ADC DX,0 MOV BX,3 L1: ADD AX,[SI] ADC DX,0 PUSH DX PUSH AX DIV BX MOV [DI],AX POP AX POP DX SUB AX, [SI-4] SUBB DX,0 ADD DI,2 ADD SI,2 LOOP L1 , 20 , 20. 在由字符串构成的缓冲区BUFFER中,前2个字节存放字符个数,后续每个字节存放 一个字符的ASCII码。编写程序实现将字符串‘2004’替换成‘2006’。 解:在数据段中定义: BUFFER DW 74 DB ‘This year is 2004. In 2004, we have a plan for reducing annual expensive 10%’ DEST DB ‘2004’ 在代码段中编写程序段: CLD LEA SI, BUFFER MOV CX, [SI] ADD SI, 2 LEA DI, DEST L1: PUSH SI PUSH DI PUSH CX MOV CX, 4 REPZ CMPSB JNZ L2 MOV BYTE PTR [SI-1],’6’ L2: POP CX POP DI POP SI INC SI INC DI LOOP L1 21. 定义有下列宏指令: WAGS MACRO S1,S2,S3 SUB AX,AX , 21 , MOV DX,AX ADD AX,S1 ADD AX,S2 ADC DX,0 ADD AX,S3 ADC DX,0 ENDM 当采用宏调用指令“WAGS 60000,25000,3000”时,执行后DX, AX, 。 解:宏指令WAGS完成的功能为S1+S2+S3,结果放在DX:AX中。所以,调用“WAGS 60000,25000,3000”时,其结果为 DX=0001H ,AX=57C0H 22. 对上题定义的宏指令,如果采用宏调用指令“WAGS BX,CX,SI”时,写出宏展开形式。 解:调用“WAGS BX,CX,SI”时,宏展开形式: SUB AX,AX MOV DX,AX ADD AX,BX ADD AX,CX ADC DX,0 ADD AX,SI ADC DX,0 23. 写出宏指令SUMMING,实现将字节缓冲区array中的内容求校验和(保留低8位), 并保存在VALUE中。 解:设array前两个字节保存缓冲区字节数,在宏指令SUMMING,将array和VALUE作为形式参数。 SUMMING MACRO array,VALUE LEA SI,array MOV CX,[SI] ADD SI,2 XOR AL,AL L1: ADD AL,[SI] INC SI , 22 , LOOP L1 MOV VALUE,AL ENDM , 23 , 第4章 汇编语言程序设计 1. 已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字 符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。 解:BUF DB "BONJOUR_BELLE" BUFR DB 100 DUP(?) MOV CX, N LEA SI, BUF LEA DI, BUFR ADD DI,CX DEC DI L1: MOV AL,[SI] MOV [DI],AL INC SI DEC DI LOOP L1 2. 利用移位、传送和相加指令实现AX的内容扩大10倍。 解:将扩大后的结果放在DX:AX中,注意到10×AX,8×AX,2×AX。 XOR DX,DX SHL AX, 1 RCL DX, 1 MOV BX,AX MOV CX,DX SHL AX, 1 RCL DX, 1 SHL AX, 1 RCL DX, 1 , 24 , ADD AX, BX ADC DX, CX 3. 在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列; 如果VAR中保存的为有符号数,则再编写程序实现将其按递减关系排列。 1236,-432,3900 解:VAR DW XOR SI,,SI MOV AX,VAR[SI] CMP AX, VAR[SI+2] JAE L1 XCHG AX, VAR[SI+2] L1: CMP AX, VAR[SI+4] JAE L2 XCHG AX, VAR[SI+4] L2: MOV VAR[SI], AX MOV AX,VAR[SI+2] CMP AX, VAR[SI+4] JAE L3 XCHG AX, VAR[SI+4] L3: MOV VAR[SI+2], AX 4. 编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例 如(AL),01100101B,(BL),11011010B,则得到的(DX),10110110 10011001B。 解:利用移位指令完成。 XOR DX,DX MOV CX,8 L1: SHR AL,1 RCR DX,1 , 25 , SHR BL,1 RCR DX,1 LOOP L1 5. 在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实 现: (1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2; (2)当两数均为奇数时,两个变量的内容不变; 3)当两数均为偶数时,两数缩小一倍后存入原处。 ( 解:当VAR1为奇数时,不论VAR2的奇偶性,这两个单元的内容均不变;只有当VAR1 为偶数时,如果VAR2为奇数,则VAR1与VAR2内容交换;如果VAR2为偶数,则两数缩 小一倍后存入原处。 DATA SEGMENT VAR1 DB 28 VAR2 DB 36 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS,AX MOV ES, AX MOV AL,VAR1 MOV BL,VAR2 TEST AL,1 JZ EVEN1 JMP OVER EVEN1: TEST BL,1 JZ EVEN2 MOV VAR1,BL , 26 , MOV VAR2,AL JMP OVER EVEN2: SHR AL,1 MOV VAR1,AL SHR BL,1 MOV VAR2,BL OVER: MOV AH,4CH MOV AL,0 INT 21H CODE ENDS END START 6. 已知在字变量VAR1、VAR2和VAR3中保存有3个相同的代码,但有一个错码,编写 程序段找出这个错码,并将它送到AX,其地址送SI;如果3个代码都相同,则在AX 中置,1标志。 解:在数据段中定义: VAR1 DW 5A34H VAR2 DW 5A35H VAR3 DW 3A34H 在代码段中编写程序段: MOV AX,-1 MOV BX,VAR1 CMP BX,VAR2 JZ L2 CMP BX,VAR3 JZ L1 MOV AX,BX LEA SI,VAR1 JMP OVER , 27 , L1: MOV AX,VAR2 LEA SI,VAR2 JMP OVER L2: CMP BX,VAR3 JZ OVER MOV AX,VAR3 LEA SI,VAR3 OVER: 7. 分析下列程序段的功能: MOV CL,04 SHL DX,CL MOV BL,AH SHL AX,CL SHR BL,CL OR DL,BL 解:程序段完成DX:AX组成的32位无符号数左移4位,低位补零(也即除以16)。 8. 下列程序段执行后,求BX寄存器的内容: MOV CL,3 MOV BX,0B7H ROL BX,1 ROR BX,CL 解:实际上完成BX内容循环右移2位,因此,BX寄存器的内容为C02DH。 9. 下列程序段执行后,求BX寄存器的内容: MOV CL,5 MOV BX,7D5CH SHR BX,CL 解:完成BX内容逻辑右移5位,因此,BX寄存器的内容为03EAH。 , 28 , 10. 将BUFFERS中N个字按相反顺序传递到BUFFERT中。 解: LEA SI,BUFFERS LEA DI,BUFFERT MOV CX,N ADD DI,N ADD DI,N SUB DI,2 L1: MOV AX,[SI] MOV [DI],AX ADD SI,2 SUB DI,2 LOOP L1 11. 数组ARRAY中存放有一组字型数据,前两个字节存放数据长度(5的倍数)。为给这 个数组中的数据进行加密保护,每5个数据取出一个数据进行加密处理:奇数位进行取 反,偶数位不变,例如对数据0110 1100 1011 0001B加密后变成1100 0110 0001 1011B, 编写加密程序encrpytion 和解密程序 unencrpytion 。 解:约定从第一个数据开始,每5个数据为一组,每组中的第一个数据采取加密/解密处理。由于加密算法采用的是取反操作,解密算法也采用取反操作,因此解密和解密算法是同一个程序。 ENCRPYTION PROC NEAR LEA SI,ARRAY XOR DX,DX MOV AX,[SI] MOV BX,5 DIV BX MOV CX, AX ADD SI, 2 L1: , 29 , MOV AX, [SI] XOR AX,0AAAAH MOV [SI], AX ADD SI,10 LOOP L1 RET ENCRPYTION ENDP 13. 设BUF中存放有N个无符号数(或有符号数),编程实现求它们的最小值(存入AX) 和最大值(存入DX)。 解:BUF存放有N个无符号数的程序如下: MOV CX,N LEA SI,BUF MOV AX,[SI] MOV DX,AX ADD SI,2 L1: CMP AX,[SI] JBE NOCHG1 XCHG AX,[SI] NOCHG1: CMP DX,[SI] JAE NOCHG2 XCHG DX,[SI] NOCHG2: ADD SI,2 LOOP L1 如果BUF中存放的是有符号数,则只需要将程序中的两行内容修改: JBE NOCHG1 改成:JLE NOCHG1 JAE NOCHG2 改成:JGE NOCHG2 , 30 , 14. 设BUFFER中存放有N个无符号(第1个字节存放缓冲区的长度),编程实现将其中的 0元素抹去,并更新其长度。 解:设BUFFER中存放的是字节型数据。采用双指针方法:SI为读指针,DI为写指针, 从低地址开始,内存中读出一个字节,如果不为0,则写入内存;如果为0,则不进行写操 作。 LEA SI, BUFFER XOR CX,CX MOV CL, [SI] INC SI MOV DI, SI XOR BH,BH XOR AL,AL L1: CMP [SI],AL JZ L2 MOV BL,[SI] MOV [DI],BL INC DI INC BH L2: INC SI LOOP L1 MOV BUFFER,BH 16. 编写一个子程序实现统计AL中1的个数,然后检测出字节型缓冲区BUF中0和1个 数相等的元素个数。 解:统计AL中1的个数,只需将AL右移,移出的一位内容进行累加,子程序为: COUNTBYTE PROC NEAR PUSH AX PUSH CX , 31 , MOV CX,8 XOR BL,BL COU1: SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RET COUNTBYTE ENDP 在此基础上,可以检测出字节型缓冲区BUF中0和1个数相等的元素个数,即一个字 节中有4个1。设BUF中有N个字节型数据,结果保持在BH中。 MOV CX,N LEA SI, BUF XOR BH,BH L1: MOV AL,[SI] CALL COUNTBYTE CMP BL,4 JNZ L2 INC BH L2: INC SI LOOP L1 19. 在缓冲区BUFFER中,第1个字节存放数组的长度(<256),从第2个字节开始存放字 符的ASCII码,编写子程序完成在最高位给字符加上偶校验。 解:STACK SEGMENT STACK 'STACK' DW 100H DUP(?) TOP LABEL BYTE STACK ENDS , 32 , DATA SEGMENT BUFFER DB 3 ;首字节为字符串长度 DB 'ABC' ;字符串 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,STACK MOV SS,AX LEA SP,TOP MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,BUFFER XOR CX,CX MOV CL,[DI] INC DI CALL SETEVEN MOV AH,4CH ;返回DOS MOV AL,0 INT 21H SETEVEN PROC NEAR ;加偶校验子程序 PUSH AX PUSH BX PUSH CX PUSH DI SETEVEN1: MOV AL,[DI] CALL COUNTBYTE , 33 , AND BL,01H JZ SETEVEN2 OR AL,80H MOV [DI],AL SETEVEN2: INC DI LOOP SETEVEN1 POP DI POP CX POP BX POP AX RET SETEVEN ENDP COUNTBYTE PROC NEAR PUSH AX PUSH CX MOV CX,8 XOR BL,BL COU1: SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RET COUNTBYTE ENDP CODE ENDS END START 20. 编写程序完成求多位数(N个字)的绝对值。 , 34 , 21. 已知斐波那契数列的定义为:,编写求该F,1,F,1,F,F,F(i,3)12ii,1i,2数列前n项的子程序。 解:设奖斐波那契数列存放在字变量RESULT中。在数据段中定义 RESULT DW 100H DUP(?) 在代码段中编写子程序 FIBONACCI PROC NEAR XOR DI,DI MOV RESULT[DI],1 ;前两个数为1 MOV RESULT[DI+2],1 ADD DI,4 MOV CX,N L1: MOV AX, RESULT[DI-4] ADD AX, RESULT[DI-2] MOV RESULT[DI],AX ADD DI,2 LOOP L1 RET FIBONACCI ENDP 22. 编写程序实现循环显示10条信息,保存每条信息的变量分别为INFOM1,INFORM10。 解:在数据段中定义变量: TABLE DW INFORM1, INFORM2, INFORM3, INFORM4, INFORM5 DW INFORM6, INFORM7, INFORM8, INFORM9, INFORM10 在代码段中编写程序段: MOV CX,10 XOR SI,SI L1: MOV DX,TABLE[SI] MOV AH,9 , 35 , INT 21H ADD SI,2 CALL WAIT LOOP L1 这里,WAIT为延时子程序,用于在显示信息之间的停顿。 23. 编写程序实现将包含20个数据的数组ARRAY分成两个数组:正数数组ARRAYP和负 数数组ARRAYN,并分别将这两个数组中数据的个数显示出来。 解:先编写一个子程序DISPALD,完成以3位十进制数形式显示出AL的内容。 DISPALD PROC NEAR PUSH AX PUSH CX PUSH DX XOR AH,AH MOV CL,100 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2 INT 21H POP AX MOV AL,AH XOR AH,AH MOV CL,10 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2 , 36 , INT 21H POP AX MOV DL,30H ADD DL,AH MOV AH,2 INT 21H POP DX POP CX POP AX RET DISPALD ENDP 在此基础上,根据题目要求,需要用到3个指针:SI指向源数组ARRAY,DI指向正数数 组ARRAYP,BX指向负数数组ARRAYN。 MOV CX,20 XOR DX,DX LEA SI,ARRAY LEA DI,ARRAYP LEA BX,ARRAYN L1: MOV AL,[SI] AND AL,AL JS L2 MOV [DI],AL INC DI INC DL JMP L3 L2: MOV [BX],AL INC BX INC DH L3: INC SI , 37 , LOOP L1 MOV AL,DL CALL DISPALD MOV AL,DH CALL DISPALD 24. 编写程序实现求缓冲区BUFFER的100个字中的最小偶数(存入AX)。 解:设BUFFER中存放的是有符号数。 MOV CX,100 LEA SI,BUFFER MOV AX, 7FFFH L1: AND WORD PTR [SI],1 JNZ L2 CMP [SI],AX JGE L2 MOV AX,[SI] L2: ADD SI,2 LOOP L1 22225. 编写程序实现求级数的前n项和刚大于2000的项数n。 1,2,?,n,?解:BL用于存放项数。 STACK SEGMENT STACK 'STACK' DW 100H DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT DB 100H DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START: , 38 , MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA SP,TOP MOV BL,1 MOV CX,0 COUNT: MOV AL, BL MUL BL ADD CX,AX CMP CX,2000 JA EXIT INC BL JMP COUNT EXIT: 26. 定义一条宏指令,实现将指定数据段的段地址传送到段寄存器ES或DS的功能。 解: 27. 定义一条宏指令,实现从键盘中输入一个字符串(利用INT 21H的09号功能)。 28. 定义一条宏指令,实现在屏幕上输出回车、换行。 29. 利用其它指令完成与下列指令一样的功能: (1)REP MOVSB; (2)REP LODSB; (3)REP STOSB; (4)REP SCASB。 解:设DF=0 (1) L1: MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI , 39 , LOOP L1 (2) L1: MOV AL,[SI] INC SI LOOP L1 ) L1: MOV ES:[DI],AL (3 INC DI LOOP L1 (4) L1: MOV AL,[SI] CMP AL,ES:[DI] INC SI INC DI LOOP L1 30. 设在数据段中定义了: STR1 DB ‘ASSEMBLE LANGUAGE’ STR2 DB 20 DUP(?) 利用字符串指令编写程序段实现: (1)从左到右将STR1中的字符串传送到STR2; (2)从右到左将STR1中的字符串传送到STR2; (3)将STR1中的第6个和第7个字节装入DX; (4)扫描STR1字符串中有无空格,如有则将第一个空格符的地址传送到SI。 解: STR1中有17个字符(含一个空格),设DS和ES均指向STR1和STR2所在的段。 (1) CLD MOV CX,17 LEA SI,STR1 LEA DI,STR2 REP MOVSB (2) MOV CX,17 LEA SI,STR1 LEA DI,STR2 , 40 , ADD SI,CX DEC SI L1: MOV AL,[SI] MOV [DI],AL DEC SI INC DI LOOP L1 (3) LEA SI,STR1 MOV DX,[SI+6] (4) MOV CX,17 LEA SI,STR1 MOV AL,20H L1: CMP [SI], AL JZ L2 INC SI LOOP L1 L2: 31. 设在数据段中定义了: STRING DB ‘Today is Sunday & July 16, 2000’ 编写程序实现将STRING中的’&’用’/’代替。 解:STRING中保存了30个字符。 MOV CX,30 LEA SI,STRING MOV AL,’&’ L1: CMP [SI],AL JNZ L2 MOV BYTE PTR [SI],’/’ L2: INC SI LOOP L1 , 41 , 32. 分析下列程序段完成的功能: MOV CX,100 LEA SI,FIRST LEA DI,SECOND REP MOVSB 解:将缓冲区FIRST中100个字节传送到SECOND中。 33. 分析下列程序段: LEA DI,STRING 200 MOV CX, CLD MOV AL,20H REPZ SCASB JNZ FOUND JMP NOT_FOUND 问:转移到FOUND的条件。 解:在缓冲区STRING中搜索非空格字符,如果有非空格则转到FOUND,如果200个单元 中都是空格,则转到NOT_FOUND。 34. 设在数据段的变量OLDS和NEWS中保存有5个字节的字符串,如果OLDS字符串不 同于NEWS字符串,则执行NEW_LESS,否则顺序执行程序。 解:设DS和ES均指向字符串OLDS和NEWS所在的段。 CLD MOV CX,5 LEA SI,OLDS LEA DI,NEWS REPZ CMPSB JNZ NEW_LESS 35. 编程实现将STRING字符串中的小写字母变换成大写字母。 解:设STRING中的字符个数为N。 , 42 , MOV CX,N LEA SI,STRING MOV AL,5FH L1: AND [SI],AL INC SI LOOP L1 36. 设在数据段中定义了: STUDENT_NAME DB 30 DUP(,) STUDENT_ADDR DB 9 DUP(,) STUDENT_PRINT DB 50 DUP(,) 编写程序实现: 用空格符清除缓冲区STUDENT_PRINT; 在STUDENT_ADDR中查找第一个’_’字符; 在STUDENT_ADDR中查找最后一个’_’字符; 如果STUDENT_NAME中全为空格符,则STUDENT_PRINT全存入’*’; 将STUDENT_NAME传送到STUDENT_PRINT的前30个字节中,将STUDENT_ADDR 传送到STUDENT_PRINT的后9个字节中。 37. (上机题)编写程序实现,将缓冲区BUFFER中的100个字按递增排序,并按下列格式顺序显示: 数据1 <原序号> 数据2 <原序号> „„ 38. (上机题)按同余法产生一组随机数N(1 A: <人数1> B: <人数2> C: <人数3> , 43 , D: <人数4> E: <人数5> F: <人数6> 39((上机题)编写程序实现下列5项功能,通过从键盘输入1,5进行菜单式选择: (1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。用户输入由英文大 小写字母或数字0,9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示: <原字符串>例如:abcdgyt0092 <新字符串> ABCDGYT0092 按任一键重做;按Esc键返回主菜单。 2)按数字键“2”,完成在字符串中找最大值。用户输入由英文大小写字母或数字 ( 0,9组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示: <原字符串> The maximum is <最大值>( 按任一键重做;按Esc键返回主菜单。 (3)按数字键“3”,完成输入数据组的排序。用户输入一组十进制数值(小于255), 然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示: <原数值串> <新数值串> 按任一键重做;按Esc键返回主菜单。 (4)按数字键“4”,完成时间的显示。首先提示用户对时,即改变系统的定时器 HH:MM:SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时 间:HH:MM:SS。 按任一键重新对时;按Esc键返回主菜单。 (5)按数字键“5”,结束程序的运行,返回操作系统。 解: ※主程序的编程思路: 此程序共5个功能,可采用跳转表法来实现多路分支结构程序设计。现将这5个程序段,各程序段的首地址分别标号为G1,G2,G3,G4,G5。将5个程序段的入口地址做成表TABLE放入数据段,程序根据给定的参数计算出欲转入的程序段的首地址在TABLE中的位置后,取出该地址,跳转至该程序段。 首先,通过调用子程序MENU,设置显示器,并输出提示文档。接着,读取‘1’-‘5’之间的ASCII表示数。然后,通过跳转表TABLE实现由输入参数转入相应的程序段。由于表中 , 44 , 按“字”存放数据,则每个数据的位移量是:0、2、4、6、8。对于输入参数N,计算位移量的公式是N=(N-1)*2。 当输入‘1’时,跳转到标号G1。调用子程序CHGLTR,完成将输入字符串中的小写字母变换成大写字母。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G1; 当输入‘2’时,跳转到标号G2。调用子程序MAXLTR,完成在输入字符串中找最大值。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G2; 当输入‘3’时,跳转到标号G3。调用子程序SORTNUM,完成输入数据组的排序。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G3。 当输入‘4’时,跳转到标号G4。调用子程序TIMCHK,完成时间的显示。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G4。 当输入‘5’时,跳转到标号G5。结束程序的运行,返回操作系统。 其流程框图见图3-1。 , 45 , START 初始化 E 调用子程序MENU 设置光标位置(41,10) 带回显的控制台输入 (AL) ? 输入字符 Y (AL) < ‘1’ N Y (AL) > ‘5’ N 将跳转表TABLE的偏移地 址送入(BX) (AL) ? (AL) – ‘1’ (AL) ? (AL) * 2 AL按符号扩展成AX (BX) ? TABLE (BX) ? (BX) + (AX) N=1 N=2 N=5 N=3 N=4 A B C D END 图3-1 主程序流程框图 , 46 , A B 调用子程序CHGLTR 调用子程序MAXLTR 带回显的控制台输入 带回显的控制台输入 (AL) ? 输入字符 (AL) ? 输入字符 N N (AL) = ESC ? (AL) = ESC ? Y Y E E C D 调用子程序SORTNUM 调用子程序TIMCHK 带回显的控制台输入 带回显的控制台输入 (AL) ? 输入字符 (AL) ? 输入字符 N N (AL) = ESC ? (AL) = ESC ? Y Y E E 图3-1(续) 主程序流程框图 ※子程序MENU的编程思路: 设置显示器显示方式为80*25彩色文本方式,清屏。逐行设置光标位置,使提示文档左对齐整体居中。输出1-5的提示文档,再输出输入N的提示。其流程框图见图3-2。 START M N 初始化 清屏 设置光标位置(5,7) 设置光标位置(5,9) 显示提示字符串STRING3 显示提示字符串STRING5 设置光标位置(5,5) 显示提示字符串STRING1 设置光标位置(5,8) 设置光标位置(5,10) 显示提示字符串STRING4 显示提示字符串设置光标位置(5,6) STRINGN 显示提示字符串STRING2 子程序MENU返回 N M 图3-2 子程序MENU流程框图 , 47 , ※子程序CHGLTR的编程思路: START 设置显示器显示方式为80*25 彩色文本方式,清屏。设置光标位初始化 清屏 置,使提示文档左对齐整体居中。 输出输入字符串提示文档,读取输 设置光标位置(5,5) 入字符串并将其放入KEYBUF。在 显示提示字符串IN_STR 输入字符串尾加结束标志$,输出输 设置光标位置(5,6) 入字符串。从前往后,依次取字符 KEYBUF ? 输入字符串 串中的每个字符,若其为小写字母, 则将其ASCII码减去20H。输出变 (AL) ? 输入字符串长度 换后的字符串。最后输出说明文档。 AL按符号扩展成AX 其流程框图见图3-3。 (CX) ? (AX) 在字符串尾加结束标志’$’ 设置光标位置(5,7) 显示提示字符串PRESTR 显示输入的字符串 (BX) ? KEYBUF + 2 N ((BX)) ? ‘a’ Y ((BX)) ? ((BX)) ? 0DFH (BX) ? (BX) + 1 N (CX) ? (CX) – 1 (CX) = 0 ? Y 设置光标位置(5,8) 显示提示字符串NEWSTR 显示变换后的字符串 设置光标位置(5,9) 显示提示字符串HINSTR 子程序CHGLTR返回 图3-3 子程序CHGLTR流程框图 , 48 , ※子程序MAXLTR的编程思路: START 设置显示器显示方式为80*25 彩色文本方式,清屏。设置光标位初始化 清屏 置,使提示文档左对齐整体居中。 输出输入字符串提示文档,读取输设置光标位置(5,5) 入字符串并将其放入KEYBUF。在显示提示字符串IN_STR 输入字符串尾加结束标志$,输出输设置光标位置(5,6) 入字符串。预设字符串中最大值为KEYBUF ? 输入字符串 0。从前往后,依次取字符串中的每 个字符,若其大于当前最大值,则 (AL) ? 输入字符串长度 进行替换,即可得到字符串中的最 AL按符号扩展成AX 大值,并输出。最后输出说明文档。 (CX) ? (AX) 其流程框图见图3-4。 在字符串尾加结束标志’$’ 设置光标位置(5,7) 显示提示字符串OUT_STR 显示输入的字符串 设置光标位置(5,8) 显示提示字符串MAXCHR (DL) ? 0 (BX) ? KEYBUF + 2 N ((BX)) > (DL) Y (DL) ? ((BX)) (BX) ? (BX) + 1 N (CX) ? (CX) – 1 (CX) = 0 ? Y 显示字符(DL) 设置光标位置(5,9) 显示提示字符串HINSTR 子程序MAXLTR返回 图3-4 子程序MAXLTR流程框图 , 49 , ※子程序SORTNUM的编程思路: START 设置显示器显示方式为80*25彩色文 本方式,清屏。设置光标位置,使提示文 初始化 清屏 档左对齐整体居中。输出输入数据组提示 文档,读取输入数据组字符串并将其放入 设置光标位置(5,5) KEYBUF。调用子程序CIN_INT,将字符 显示提示字符串IN_NUM 串转换成数据串。判断数据串是否有错误 设置光标位置(5,6) 或者为空,若是,则重新输入数据组。调 KEYBUF ? 输入字符串 用子程序MPSORT,采用冒泡法对数据串 进行排序。再调用子程序INT_OUT,输出 排序后的数据组。最后输出说明文档。 调用子程序CIN_INT 其流程框图见图3-5。 Y (AL) = 0 ? N 设置光标位置(5,7) 显示提示字符串OUT_NUM 设置光标位置(5,8) 调用子程序MPSORT 调用子程序INT_OUT 设置光标位置(5,9) 显示提示字符串HINSTR 子程序SORTNUM返回 图3-5 子程序SORTNUM流程框图 ※子程序CIN_INT的编程思路: 入口参数为:无;出口参数为:AL(有无错误标志,0为有,1为无)。从前往后,依次取字符串中的每个字符进行判断。CH表示数据组数据个数,AL表示当前数据x,DL作为有无数据标志。若当前字符为空格,则转到ADDNUM,判断DL是否为1,若为1,则CH增1,调用子程序ADDNEW,增加新数x,然后DL、AL清零;否则判断当前字符c是否在‘0’-‘9’之间,若不是,则判错,将AL置0,子程序CIN_INT返回;否则,DL置1,x=x*10+c-‘0’,判断x是否超过255,若是,则判错,将AL置0,子程序CIN_INT返回;否则,对下一个字符进行操作。字符串判断结束后,若DL为1,则有新数x未加至数据组,调用子程序ADDNEW,增加新数x。将数据组个数CH放入NUMBUF,将AL置1。 其流程框图见图3-6。 ※子程序ADDNEW的编程思路: 入口参数为:CH(数据组数据个数)、AL(当前数据x);出口参数为:无。取出数据组NUMBUF的首地址,加上数据组数据个数,即为当前数据x的地址,将x放入该地址。 其流程框图见图3-7。 , 50 , START T 初始化 NUMBUF ? (CH) (CL) ? 输入字符串长度 (AL) ? 1 (SI) ? KEYBUF + 2 R (CH) ? 0 (DH) ? 10 (AL) ? 0 (AL) ? 0 (DL) ? 0 子程序CIN_INT返回 Y ((SI)) = ‘ ’ ? N N (DL) ? 1 ? Y ((SI)) < ‘0’ R Y N (CH) ? (CH) + 1 Y 调用子程序ADDNEW ((SI)) > ‘9’ R (DL) ? 0 N (AL) ? 0 (DL) ? 1 (AX) ? (AL) * (DH) (BH) ? 0 (BL) ? ((SI)) 图3-6 子程序CIN_INT流程框图 (AX) ? (AX) + (BX) (AX) ? (AX) – ‘0’ START Y (AH) > 0 R 初始化 N BX、AX进栈 (SI) ? (SI) + 1 (BX) ? NUMBUF (CL) ? (CL) - 1 (AL) ? (CH) Y AL按符号扩展成AX (CL) ? 0 ? (BX) ? (BX) + (AX) N AX出栈 Y ((BX)) ? (AL) (DL) ? 1 ? T BX出栈 N (CH) ? (CH) + 1 子程序ADDNEW返回 调用子程序ADDNEW 图3-7 子程序ADDNEW流程框图 , 51 , ※子程序MPSORT的编程START 思路: 对N个数据进行从小到大(AL) ? (NUMBUF) 排序,采用“冒泡法”:从前 往后,每两个数据进行比较, Y 当前者大于后者时,交换两者(AL) ?1 的次序;否则不变。经过N-1 N 次比较,可以将最大值交换到 第N个单元。接着对前N-1个AL按符号扩展成AX 数据,重复上述过程,使次大(CX) ? (AX) 值交换到第N-1个单元;依此(SI) ? NUMBUF 类推,若某次比较过程,无任(SI) ? (SI) + (CX) 何交换,则终止其后的所有比(CX) ? (CX) – 1 较过程。最多进行N-1次比较 过程,可以完成数据的排序操CX、SI进栈 作。 (DL) ? 0 其流程图见图3-8。 (AL) ? ((SI)) Y (AL) ? ((SI)–1) N (AL) ?? ((SI–1)) ((SI)) ? (AL) (DL) ? 1 (SI) ? (SI) - 1 N (CX) ? (CX) – 1 (CX) = 0 ? Y ((BX)) > ‘9‘ SI、CX出栈 N (DL) = 1 ? Y Y N (CX) ? (CX) – 1 (CX) = 0 ? 子程序MPSORT返回 ((BX)) > ‘9‘ 图3-8 子程序MPSORT流程框图 , 52 , ※子程序IN_OUT的编程思路: START 从数据组中依次取出每个数据,调用 OUTNUM,将十进制数据转成十六进制进行初始化 输出,数据之间输出一个空格作为分隔符。 (AL) ? (NUMBUF) 其流程图见图3-9。 AL按符号扩展成AX (CX) ? (AX) (BL) ? 10H (SI) ? NUMBUF + 1 (AL) ? ((SI)) 调用子程序OUTNUM (SI) ? (SI) + 1 显示字符‘ ’ START (CX) ? (CX) – 1 N (CX) = 0 ? 初始化 (AH) ? 0 Y ((BX)) > ‘9‘ (AX)/(BL) ? 商(AL),余(AH) 子程序INT_OUT返回 AX进栈 图3-9 子程序INT_OUT流程框图 Y (AH) < 10 N (AH) ? (AH)+7 ※子程序OUTNUM的编程思路: 入口参数:AL(待转换的数据),BL(转 (AH) ? (AH)+30H 换进制数);出口参数:无。待转换数据x除以 (DL) ? (AH) 转换进制数,商为新的x,余数y为转换后的低 AX出栈,DX进栈 位。保存y,调用子程序OUTNUM本身,对新 的x进行进制转换并输入。取出y,对其进行输 入,若低于10,则直接输出,否则转换成字母Y (AL) = 0 ? 输出。 其流程图见图3-10。 N 调用子程序OUTNUM DX出栈 显示字符(DL) 子程序OUTNUM返回 图3-10 子程序OUTNUM流程框图 , 53 , ※子程序TIMCHK的编程思路: 设置显示器显示方式为80*25彩START 色文本方式,清屏。设置光标位置, 输出设置时间提示文档。读取输入时初始化 清屏 间字符串并将其放入KEYBUF。分别 判断时、分、秒是否在有效数字范围,设置光标位置(5,6) 若有效,则设置新的系统时间。调用显示提示字符串IN_TIM 子程序TIME,在屏幕的右上角实时显KEYBUF ? 输入字符串 示时间。 其流程框图见图3-11。 (AL) ? 输入字符串的1-2位数值(时) Y (AL)<0或F (AL)?24 N (CH) ? (AL) (AL) ? 输入字符串的4-5位数值(分) Y (AL)<0或F (AL)?60 N (CL) ? (AL) (AL) ? 输入字符串的7-8位数值(秒) Y (AL)<0或F (AL)?60 N (DH) ? (AL) (DL) ? 0 置系统时间 F 调用子程序TIME 子程序TIMCHK返回 图3-11 子程序TIMCHK流程框图 , 54 , ※子程序TIME的编程思路: START 设置显示器显示方式为80*25 彩色文本方式,清屏。设置光标位置,初始化 清屏 输出说明文档。实时显示时间:设置 光标至屏幕右上角;读取系统时间,设置光标位置(10,9) 调用子程序SHOWNUM分别对时、显示提示字符串HINSTR 分、秒进行显示,并用‘:’作分隔符; 设置光标等待位置,并进行延时;检设置光标位置(72,0) 查键盘状态,若无键盘输入,则重复取系统时间 上述步骤显示时间,否则子程序(AL) ? (CH) TIME返回。 调用子程序SHOWNUM 其流程框图见图3-12。 显示字符‘:’ (AL) ? (CL) 调用子程序SHOWNUM 显示字符‘:’ (AL) ? (DH) 调用子程序SHOWNUM ※子程序SHOWNUM的编程思路: 设置光标位置(10,9) 入口参数:AL(待显示的数据); 出口参数:无。待显示数据x除以 (BX) ? 0018H 10,商为y,余数为z。将数字y、z 分别转换成字符数字,然后输出。 其流程框图见图3-13。 (CX) ? 0 START Y (CX) ? (CX) – 1 (CX) = 0 ? 初始化 AL按符号扩展成AX N CX、DX进栈 (BX) ? (BX) – 1 (CL) ? 10 Y (AX)/(BL) ? 商(AL),余(AH) (BX) ? 0 ? (AH) ? (AH)+ ‘0’ N (BH) ? (AH) 检查键盘状态 (AL) ? (AL)+ ‘0’ 显示字符(AL)、(BH) Y AL = 0 ? DX、CX出栈 N 子程序TIME返回 子程序SHOWNUM返回 图3-12 子程序TIME流程框图 图3-13 子程序SHOWNUM流程框图 , 55 , 四、程序代码 STACK SEGMENT STACK DB 256 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT TABLE DW G1, G2, G3, G4, G5 STRING1 DB '1. Change small letters into capital letters of string;', 0DH, 0AH, '$' STRING2 DB '2. Find the maximum of string;', 0DH, 0AH, '$' STRING3 DB '3. Sort for datas;', 0DH, 0AH, '$' STRING4 DB '4. Show Time;', 0DH, 0AH, '$' STRING5 DB '5. Exit.', 0DH, 0AH, '$' STRINGN DB 'Input the number you select (1-5) : $' IN_STR DB 'Input the string (including letters & numbers, less than 60 letters) :', 0DH, 0AH, '$' PRESTR DB 'Original string : $' NEWSTR DB 'New string : $' OUT_STR DB 'The string is $' MAXCHR DB 'The maximum is $' IN_NUM DB 'Input the numbers (0 - 255, no more than 20 numbers) : ', 0DH, 0AH, '$' OUT_NUM DB 'Sorted numbers : ', 0DH, 0AH, '$' IN_TIM DB 'Correct the time (HH:MM:SS) : $' HINTSTR DB 'Press ESC, go back to the menu; or press any key to play again!$' KEYBUF DB 61 DB ? DB 61 DUP (?) NUMBUF DB ? DB 20 DUP (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP MAIN: CALL FAR PTR MENU ; 设置显示器 AGAIN: MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 41 ; 列号 MOV DH, 10 ; 行号 INT 10H ; 光标位置设置 , 56 , MOV AH, 1 INT 21H CMP AL, '1' JB AGAIN CMP AL, '5' JA AGAIN SUB AL, '1' ; N-1 SHL AL, 1 ; (N-1)*2 CBW ; AL->AX LEA BX, TABLE ADD BX, AX JMP WORD PTR [BX] G1: CALL FAR PTR CHGLTR MOV AH, 8 INT 21H CMP AL, 1BH JZ MAIN JMP G1 G2: CALL FAR PTR MAXLTR MOV AH, 8 INT 21H CMP AL, 1BH JZ MAIN JMP G2 G3: CALL FAR PTR SORTNUM MOV AH, 8 INT 21H CMP AL, 1BH JZ MAIN JMP G3 G4: CALL FAR PTR TIMCHK MOV AH, 8 INT 21H CMP AL, 1BH JZ MAIN JMP G4 G5: MOV AH, 4CH INT 21H , 57 , MENU PROC FAR ; 显示主界面 ;设置显示器方式 MOV AH, 0 MOV AL, 3; MOV BL, 0; INT 10H ; 清屏 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 INT 10H ; 光标位置设置 MOV AH, 9 LEA DX, STRING1 INT 21H MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 光标位置设置 MOV AH, 9 LEA DX, STRING2 INT 21H MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 光标位置设置 MOV AH, 9 LEA DX, STRING3 INT 21H MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 光标位置设置 MOV AH, 9 LEA DX, STRING4 INT 21H MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 光标位置设置 MOV AH, 9 LEA DX, STRING5 INT 21H MOV AH, 2 MOV DL, 5 ; 列号 , 58 , MOV DH, 10 ; 行号 INT 10H ; 光标位置设置 MOV AH, 9 LEA DX, STRINGN INT 21H RET MENU ENDP CHGLTR PROC FAR ; 将输入字符串中小写字母便换成大写字母 RECHG: ;设置显示器方式 MOV AH, 0 MOV AL, 3 MOV BL, 0 INT 10H ; 清屏 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 INT 10H ; 输入提示光标位置设置 MOV AH, 9 LEA DX, IN_STR INT 21H ; 输入字符串提示 MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 输入字符串光标位置设置 MOV AH, 0AH LEA DX, KEYBUF INT 21H ; 输入字符串 CMP KEYBUF + 1, 0 JZ RECHG ; 判断输入字符串是否为空串 LEA BX, KEYBUF + 2 MOV AL, KEYBUF + 1 CBW MOV CX, AX ADD BX, AX MOV BYTE PTR [BX], '$' ; 在输入字符串尾加结束标志$ MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 源字符串提示光标位置设置 MOV AH, 9 LEA DX, PRESTR , 59 , INT 21H ; 输出源字符串提示 MOV AH, 9 LEA DX, KEYBUF + 2 INT 21H ; 输出源字符串 LEA BX, KEYBUF + 2 LCHG: CMP BYTE PTR [BX], 61H JB NOCHG AND BYTE PTR [BX], 0DFH NOCHG: INC BX LOOP LCHG ; 将字符串中小写字母转换成大写字母 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 新字符串提示光标位置设置 MOV AH, 9 LEA DX, NEWSTR INT 21H ; 输出新字符串提示 MOV AH, 9 LEA DX, KEYBUF + 2 INT 21H ; 输出新字符串 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOV AH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 RET CHGLTR ENDP MAXLTR PROC FAR ; 在输入字符串中找出最大值 REMAX: ;设置显示器方式 MOV AH, 0 MOV AL, 3 MOV BL, 0 INT 10H ; 清屏 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 , 60 , INT 10H ; 输入提示光标位置设置 MOV AH, 9 LEA DX, IN_STR INT 21H ; 输入字符串提示 MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 输入字符串光标位置设置 MOV AH, 0AH LEA DX, KEYBUF INT 21H ; 输入字符串 CMP KEYBUF + 1, 0 JZ REMAX ; 判断输入字符串是否为空串 LEA BX, KEYBUF + 2 MOV AL, KEYBUF + 1 CBW MOV CX, AX ADD BX, AX MOV BYTE PTR [BX], '$' ; 在输入字符串位加结束标志$ MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 源字符串提示光标位置设置 MOV AH, 9 LEA DX, OUT_STR INT 21H ; 输出字符串提示 MOV AH, 9 LEA DX, KEYBUF + 2 INT 21H ; 输出字符串 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 新字符串提示光标位置设置 MOV AH, 9 LEA DX, MAXCHR INT 21H ; 输出字符串中最大值提示 MOV DL, 0 LEA BX, KEYBUF + 2 LCMP: CMP [BX], DL JB NOLCHG MOV DL, [BX] , 61 , NOLCHG: INC BX LOOP LCMP ; 找出字符串中最大字符,放入DL MOV AH, 2 INT 21H ; 输出字符串中最大字符 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOV AH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 RET MAXLTR ENDP SORTNUM PROC FAR ; 对输入数据组排序 RESORT: ;设置显示器方式 MOV AH, 0 MOV AL, 3 MOV BL, 0 INT 10H ; 清屏 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 INT 10H ; 输入提示光标位置设置 MOV AH, 9 LEA DX, IN_NUM INT 21H MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 输入数据组光标位置设置 MOV AH, 0AH LEA DX, KEYBUF INT 21H ; 输入数据组字符串 CALL CIN_INT ; 字符串转换成数据串 CMP AL, 0 JZ RESORT ; 判断数据串是否有错 CMP NUMBUF, 0 JZ RESORT ; 判断数据串是否为空 , 62 , MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 输出提示光标位置设置 MOV AH, 9 LEA DX, OUT_NUM INT 21H ; 输出数据串提示 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 输出数据组光标位置设置 CALL FAR PTR MPSORT ; 数据组排序 CALL FAR PTR INT_OUT ; 数据组的输出 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOV AH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 RET SORTNUM ENDP CIN_INT PROC NEAR ; 读入整型数 ; 入口参数:无 ; 出口参数为:AL(有无错误标志,0为有,1为无) MOV CL, KEYBUF + 1 LEA SI, KEYBUF + 2 MOV CH, 0 ; 数据组数据个数置0 MOV DH, 10 MOV AL, 0 ; 当前数据x=0 MOV DL, 0 ; 有无数据标志置0,即无数据 FNDNUM: CMP BYTE PTR [SI], ' ' JZ ADDNUM ; 判断当前字符是否为空格 CMP BYTE PTR [SI], '0' JB ERRNUM CMP BYTE PTR [SI], '9' JA ERRNUM ; 判断当前字符是否在'0'-'9'之间 MOV DL, 1 ; 有无数据标志置1,即有数据 MUL DH , 63 , XOR BH, BH MOV BL, [SI] ADD AX, BX SUB AX, '0' ; 计算出当前数据x CMP AH, 0 JA ERRNUM ; 判断x是否越界 JMP NEXT ADDNUM: CMP DL, 1 JNZ NEXT ; 判断是否有数据 INC CH ; 数据组数据个数加1 CALL ADDNEW MOV DL, 0 MOV AL, 0 ; 清零 NEXT: INC SI DEC CL CMP CL, 0 JNZ FNDNUM ; 依次检查各字符 CMP DL, 1 JNZ TOTAL ; 判断是否有未加入的数据 INC CH CALL ADDNEW TOTAL: MOV NUMBUF, CH ; 置数据组数据个数 MOV AL, 1 ; 输入数据无错误 JMP CRTNUM ERRNUM: MOV AL, 0 ; 输入数据有错误 CRTNUM: RET CIN_INT ENDP ADDNEW PROC NEAR ; 增加新数 ; 入口参数:CH(数据组数据个数)、AL(当前数据x) ; 出口参数:无 PUSH AX LEA BX, NUMBUF MOV AL, CH CBW ADD BX, AX POP AX MOV [BX], AL RET ADDNEW ENDP , 64 , MPSORT PROC FAR ; 数据组排序 MOV AL, NUMBUF CMP AL, 1 JBE NOSORT ; 若只有一个元素,停止排序 CBW MOV CX, AX LEA SI, NUMBUF ; SI指向数据组首地址 ADD SI, CX ; SI指向数据组末地址 DEC CX ; 外循环次数 LP1: ; 外循环开始 PUSH CX PUSH SI MOV DL, 0 ; 交换标志置0 LP2: ; 内循环开始 MOV AL, [SI] CMP AL, [SI - 1] JAE NOXCHG XCHG AL, [SI - 1] ; 交换操作 MOV [SI], AL MOV DL, 1 ; 交换标志置1 NOXCHG: DEC SI LOOP LP2 POP SI POP CX CMP DL, 1 JNZ NOSORT ; 判断交换标志 LOOP LP1 NOSORT:RET MPSORT ENDP INT_OUT PROC FAR ; 输出数据组 MOV AL, NUMBUF CBW MOV CX, AX MOV BL, 10H LEA SI, NUMBUF + 1 PRINT: MOV AL, [SI] CALL OUTNUM INC SI MOV AH, 2 MOV DL, ' ' INT 21H LOOP PRINT , 65 , RET INT_OUT ENDP OUTNUM PROC NEAR ; 将十进制数以十六进制输出 ; 入口参数:AL(待转换的数据),BL(转换进制数16) ; 出口参数:无 MOV AH, 0 DIV BL PUSH AX CMP AH, 10 JB PNUM ADD AH, 7 PNUM: ADD AH, 30H MOV DL, AH POP AX PUSH DX CMP AL, 0 JZ OUTN CALL OUTNUM OUTN: POP DX MOV AH, 2 INT 21H RET OUTNUM ENDP TIMCHK PROC FAR ; 设定并显示时间 ;设置显示器方式 MOV AH, 0 MOV AL, 3; MOV BL, 0; INT 10H ; 清屏 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 设置提示光标位置设置 MOV AH, 9 LEA DX, IN_TIM INT 21H ; 时间串提示 MOV AH, 0AH LEA DX, KEYBUF INT 21H ; 输入时间串 , 66 , MOV BL, 10 MOV AL, KEYBUF + 2 SUB AL, '0' MUL BL ADD AL, KEYBUF + 3 SUB AL, '0' CMP AL, 0 JB INVALID CMP AL, 24 JAE INVALID ; 判断 时 有效性 MOV CH, AL MOV AL, KEYBUF + 5 SUB AL, '0' MUL BL ADD AL, KEYBUF + 6 SUB AL, '0' CMP AL, 0 JB INVALID CMP AL, 60 JAE INVALID ; 判断 分 有效性 MOV CL, AL MOV AL, KEYBUF + 8 SUB AL, '0' MUL BL ADD AL, KEYBUF + 9 SUB AL, '0' CMP AL, 0 JB INVALID CMP AL, 60 JAE INVALID ; 判断 秒 有效性 MOV DH, AL MOV DL, 0 MOV AH, 2DH INT 21H ; 置系统时间 INVALID: CALL TIME RET TIMCHK ENDP TIME PROC ; 显示时间子程序 ;设置显示器方式 MOV AH, 0 MOV AL, 3; MOV BL, 0; INT 10H ; 清屏 , 67 , MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 10 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOV AH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 DISP1: MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 72 ; 列号 MOV DH, 0 ; 行号 INT 10H ; 提示光标位置设置 MOV AH, 2CH ; 取系统时间,CH,CL,DH分别存放时/分/秒 INT 21H MOV AL, CH ; 显示 时 CALL SHOWNUM MOV AH, 2 MOV DL, ':' INT 21H MOV AL, CL ; 显示 分 CALL SHOWNUM MOV AH, 2 MOV DL, ':' INT 21H MOV AL, DH ; 显示 : 秒 CALL SHOWNUM MOV AH,02H ; 设置光标位置 MOV DX,090AH MOV BH,0 INT 10H MOV BX,0018H RE: MOV CX,0FFFFH ; 延时 REA: LOOP REA DEC BX JNZ RE MOV AH, 0BH ; 或 MOV AH, 01H INT 21H ; INT 16H CMP AL, 0 ; JE DISP1 JZ DISP1 ; 检查键盘状态 RET TIME ENDP , 68 , SHOWNUM PROC ; 把AL中的数字以十进制输出 ; 入口参数:AL(待显示的数据) ; 出口参数:无 CBW PUSH CX PUSH DX MOV CL, 10 DIV CL ADD AH, '0' MOV BH, AH ADD AL, '0' MOV AH, 2 MOV DL, AL INT 21H MOV DL, BH INT 21H POP DX POP CX RET SHOWNUM ENDP CODE ENDS END START 五、实验结果 运行程序。 主菜单界面,如图5-1。 图5-1 主菜单界面 , 69 , 在主菜单界面(图5-1)输入1,进入功能1界面,实现将字符串中的小写字母变换成大写字母。功能1界面,如图5-2。输入字符串,如:HuangCui02061488,输出结果如图5-3。按ESC键,返回主菜单界面(图5-1);按其他任意键,返回功能1界面(图5-2)。 图5-2 功能1界面 图5-3 功能1运行结果 在主菜单界面(图5-1)输入2,进入功能2界面,实现在字符串中找最大值。功能2界面,如图5-4。输入字符串,如:HuangCui02061488,输出结果如图5-5。按ESC键,返回主菜单界面(图5-1);按其他任意键,返回功能2界面(图5-4)。 图5-4 功能2界面 , 70 , 图5-5 功能2运行结果 在主菜单界面(图5-1)输入3,进入功能3界面,实现输入数据组的排序,按递增方式进行排序并以十六进制数输出。功能3界面,如图5-6。输入数据组,如:255 15 0 1 16,输出结果如图5-7;若输入数据越界或有错误,则需重新输入,如图5-6。按ESC键,返回主菜单界面(图5-1);按其他任意键,返回功能3界面(图5-6)。 图5-6 功能3界面 图5-7 功能3运行结果 , 71 , 在主菜单界面(图5-1)输入4,进入功能4界面,实现时间的显示。功能4界面,如图5-8。输入用户设置的时间;若输入时间越界或有错误,则不修改系统时间,直接进行实时显示。如:输入12:70:00,输出结果如图5-9(显示时间由系统当时获取时间决定,本实验时,系统时间为18:27:36);输入12:00:00,输出结果如图5-10。接着,界面对时间进行实时显示,此处仅作文字说明,不附图。按ESC键,返回主菜单界面(图5-1);按其他任意键,返回功能4界面(图5-8)。 图5-8 功能4界面 图5-9 功能4运行结果1 , 72 , 图5-10 功能4运行结果2 在主菜单界面(图5-1)输入5,结束程序的运行,返回操作系统。 , 73 ,
本文档为【微机原理与接口技术(楼顺天版)课后习题答案14章】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_633808
暂无简介~
格式:doc
大小:255KB
软件:Word
页数:96
分类:其他高等教育
上传时间:2017-09-19
浏览量:318