2022年汇编语言程序设计程学先汇编第,章作业参考答案

上传人:痛*** 文档编号:117301773 上传时间:2022-07-08 格式:PDF 页数:35 大小:123.41KB
返回 下载 相关 举报
2022年汇编语言程序设计程学先汇编第,章作业参考答案_第1页
第1页 / 共35页
2022年汇编语言程序设计程学先汇编第,章作业参考答案_第2页
第2页 / 共35页
2022年汇编语言程序设计程学先汇编第,章作业参考答案_第3页
第3页 / 共35页
点击查看更多>>
资源描述
2.16 编写程序段,使(AH)与(AL)中地内容互换.解 1 MOV BL,AL MOV AL,AH.MOV AH,BL 解 2 XCHG AH,AL 2.17 编写程序段,使(BL)中高 4 位与低 4 位内容互换.解 1 MOV CL,4 MOV BH,0 SHL BX,CL ADD BL,BH 解 2 MOV CL,4 ROL BL,CL 2.18 编写程序段,实现当(DL)是奇数时使(AL)=31H,否则使(AL)=30H.SHR DL,1 MOV AL,0 RCL AL,1 ADD AL,30H 2.20 设寄存器AX 中存放1234H,BX 寄存器中存放1,执行 DIV BL 指令后,会发生什么现象?为什么?溢出,商超过 8位,在 AL 中存放不下商.2.21 设 DX 寄存器中存放值为 0,AX 中存放 1234H,BX 中存放 1,执行 DIV BX 后,是否会出现与 2.20 相同现象?为什么?不会,因为是 16 位除法,商未超过16 位2.22 一字数据压栈时堆栈指针如何改变?弹出一字数据时堆栈指针如何改变?压栈时堆栈指针减2;弹出一字数据时堆栈指针加2 2.23 已知(SP)=2088H,(AX)=1A89H,(BX)=90CDH.依次执行以下三条指令后,画图说明堆栈中数据情况,及 SP、AX、BX 中数据.PUSH AX PUSH BX POP AX(SP)=2086H,(AX)=90CDH,(BX)=90CDH.*2.25 编写程序段求8!(8 地阶乘).MOV AX,8 MOV BX,7 NEXT:DX,0 MUL BX DEC BX JNZ NEXT 2.27 假设(AX)=07EH,变量 BUFFER 中存放地内容为B5H,求下列各条指令单独执行后地结果.精选学习资料 -名师归纳总结-第 1 页,共 35 页(1)AND AX,BUFFER 34H(2)XOR AX,BUFFER CBH(3)OR AX,BUFFER 0FFH(4)ANDAX,0 0(5)XOR AX,OFFH 81H(6)TEST AX,8000H 相与结果为0 时.AX 为正,值不变*2.28 编写程序段,判断(AL)中地有符号数是正数还是负数,正数在 CL 中写 0,否则写 1.CMP AL,0 MOV CL,0 JGE NEXT MOV CL,1 NEXT:2.29 编写程序段,对存放在(DX)、(AX)中地双字数据求补.MOV BX,0 SUB BX,AX MOV AX,BX MOV BX,0 SBB BX,DX MOV DX,BX 2.31 假设(DX)=78D5H,(CL)=5,CF=0,确定下列各条指令单独执行后(DX)中地值.(1)SHL DH,1 (DX)=F0D5H(2)SAL DX,CL (DX)=1AA0H(3)SHR DX,CL (DX)=03C6H(4)SAR DL,1 (DX)=78EAH(5)ROL DX,CL (DX)=1AAFH(6)RCR DL,1 (DX)=786AH(7)RCL DH,CL (DX)=0FD5H 2.32 按下列要求编写指令序列.(1)清除 DH 中最低 3 位而不改变其他位,结果存入 BH.AND DH,0F8H(2)将 DI 中最高 3 位置 1 而不改变其他位.OR DI,0E000H(3)将 AX 中 03 位置 1、79 位取反、其他位清0.OR AX,0FH XOR AX,380H AND AX,38FH(4)检查 BX 中第 2、5、9位是否至少有1位是 1.TEST AX,224H 如果结果非0(5)检查 CX 中第 1、6、11位是否同时为1.NOT CX TEST CX,842H 如果结果为0(6)检查 BX 中第 0、2、9、13 位是否至少有1 位是 0.NOT BX TEST BX,2205H 如果结果非0 精选学习资料 -名师归纳总结-第 2 页,共 35 页(7)检查 DX 中第 1、4、11、14 位是否同时是0.TEST DX,4812H 如果结果为0 2.33 编写指令序列分别实现下述功能.(1)右移 DI3 位,并将 0 移入最高位.MOV CL,3 SHR DI,CL(2)将 AL 左移一位,将 0移入最低位.SHL AL,1(3)DX 右移 6位且保持正负特性不变.MOV CL,6 SAR DX,CL(4)将 AL 中压缩 BCD 码变成 AX 中地非压缩BCD 码.MOV AH,0 MOV CL,4 SHL AL,CL MOV CL,4 SHR AL,CL 2.34 分析下面地程序段完成什么功能?MOV CL,4 SHR AX,CL MOV BL,DL SHR DX,CL SHL BL,CL OR AH,BL 将双字(DX,AX)逻辑右移4位*2.35 设数据段偏移地址1000H 处开始存放有10个字节数据,将其求和,结果存放在AX 中.MOV CX,10 MOV SI,1000H MOV AX,0 CLC LOOP1:ADC AX,SI INC SI LOOP LOOP1 2.37 从键盘输入0到 9 之间某数字字符,利用列表法将该数字地平方值放到AL 中.SUB DB 0,1,4,9,16,25,36,49,64,81 MOV AH,1 INT 21H SUB AL,30H MOV BL,AL MOV BH,0 MOV AL,SUBBX 2.38 已知 X、Y、Z、P、K 均为 16 位带符号数,求计算(1000+X*Y-Z)/P地程序段.注明结果地商与余数所存放地位置.精选学习资料 -名师归纳总结-第 3 页,共 35 页MOV AX,X IMUL Y ;x*y MOV CX,AX MOV BX,DX MOV AX,Z CWD ;符号扩展,AX 中符号扩展到DX 中SUB CX,AX SBB BX,DX ;x*y-z MOVAX,1000 MOV DX,0 SUB AX,CX SBB DX,BX MOV BX,P IDIV BX;(1000+X*Y-Z)/P 4.1 编制程序计算Y5X7,设 X 值在 DAX 字节单元,结果存入RLT 字节单元.X 为带符号整数.精选学习资料 -名师归纳总结-第 4 页,共 35 页DATA SEGMENT DAX DB 15H RLT DB 0 DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV AL,DAX MOV BL,5 。X*5 IMUL BL。有符号数乘法 ADD AL,7 MOV RLT,AL MOV AH,4CH INT 21H CODE ENDS END START 。DAX 绝对值不能超过18H(0-18H 或 0FFH-0E9H).。否则,RLT 得为字类型,ADD AL,7 改为 ADD AX,7。因为 7 已知为正,无需符号扩展.4.3 编制程序计算XY.设 X、Y 分别在 DAX、DAY 单元,结果存入RESULT 单元.(1)X、Y 为字节数据(2)X、Y 为字数据(3)X、Y 为双字节数据要求:存取数据时至少使用三种不同地寻址方式.1、用直接寻址DATA SEGMENT DAX DB 18H DAY DB 65H RESULT DB 0 DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV AL,DAX 。源操作数为直接寻址 SUB AL,DAY MOV RESULT,AL MOV AH,4CH INT 21H 精选学习资料 -名师归纳总结-第 5 页,共 35 页 CODE ENDS END START 2、换间接寻址与相对寻址DATA SEGMENT DAX DW 18H DAY DW 65H RESULT DW 0 DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV SI,DAX MOV DI,RESULT MOV AX,SI 。源操作数为间接寻址 SUB AX,SI+2 。源操作数为相对寻址MOV DI,AX MOV AH,4CH INT 21H CODE ENDS END START 3、X、Y 为双字节数据,必须分高16 位与低 16 位分别运算方法 1 DATA SEGMENT DAX DD 2A341928H DAY DD 6873BC25H RESULTDD 0 DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV AX,WORD PTR DAX 。减低 16 位 SUB AX,WORD PTR DAY MOV WORD PTR RESULT,AX MOV AX,WORD PTR DAX+2 。减高 16 位 SUB AX,WORD PTR DAY+2 MOV WORD PTR RESULT+2,AX 精选学习资料 -名师归纳总结-第 6 页,共 35 页 MOV AH,4CH INT 21H CODE ENDS END START。特别注意加“WORD PTR”。注意低16 位与高 16 位各是如何表示地.。还要注意,本题要求出现三种以上寻址方式.目前解中用到了寄存器寻址、直接寻址、间接寻址与相对寻址4 种方式.方法 2:LEA SI,DAX LEA DI,DAY LEA BX,RESULT MOV AX,SI SUB AX,DI 。减低 16 位MOV BX,AX MOV AX,SI+2 SBB AX,DI+2 。减高 16 位MOV BX+2,AX 4.4 设内存OPCD 单元存放一个16 位代码,编制程序将其中15 13,128,73,20 位地代码分别存入WCD 开始地单元.每段代码地最低位与单元地第0 位对齐.解法 1:DATA SEGMENT OPCD DW 2A5CH WCD DW?,?,?,?DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV AX,OPCD MOV CL,13 。逻辑右移13 位 SHR AX,CL MOV WCD,AX MOV AX,OPCD AND AX,1FFFH 。屏蔽高3位 MOV CL,8 。逻辑右移13 位 SHR AX,CL MOV WCD+2,AX 精选学习资料 -名师归纳总结-第 7 页,共 35 页 MOV AX,OPCD AND AX,0FFH MOV CL,3 SHR AX,CL MOV WCD+4,AX MOV AX,OPCD AND AX,7 MOV WCD+6,AX MOV AH,4CH INT 21H CODE ENDS END START 解法 2:下面一种方法是4 个字生成地程序段全一样,可以类似于逻辑尺建立一个数据表,变成循环来做.MOV AX,OPCD MOV CL,3 ROR AX 。循环右移3 位MOV BX,AX 。暂存 AX AND AX,07H 。保留低3位MOV WCD,AX MOV AX,BX 。恢复 AX MOV CL,5 ROR AX 。循环右移5 位MOV BX,AX 。暂存 AX AND AX,1F MOV WCD+2,AX 。保留低5 位MOV AX,BX MOV CL,5 ROR AX MOV BX,AX AND AX,1F MOV WCD+4,AX MOV AX,BX MOV CL,3 ROR AX MOV BX,AX AND AX,07H MOV WCD+6,AX 精选学习资料 -名师归纳总结-第 8 页,共 35 页4.5 利用查表地方法计算SX2Y2,设 0X15,0Y15,且分别在DAX、DAY 字节单元存放,结果存入RLT 单元.DATA SEGMENT TAB DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225 。建立平方值表 DAX DB 11 。假设 X 地值 DAY DB 13 。假设 Y 地值 RLT DW?DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV AL,DAX LEA BX,TAB 。指向平方值表 XLAT 。根据 X 地值查表 MOV AH,0 MOV RLT,AX MOV AL,DAY 。根据 Y 地值查表 XLAT MOV AH,0 ADD RLT,AX 。求 SX2Y2 MOV AH,4CH INT 21H CODE ENDS END START 4.6 编程实现把键入地一个字符,用二进制形式(0/1)显示出它地ASCII 代码值.MOV AH,1 。键入一个字符INT 21H MOV CX,8 NEXT:ROL AL,1 。循环左移一位 MOV DL,AL ANDDL,1;保留最低1 位ADD DL,30H;显示一位 MOV AH,2 INT 21H LOOPNEXT 4.7 编写一个程序,把从键盘输入地一个小写字母用大写字母显示出来.MOV AH,1 。键入一个字符INT 21H 精选学习资料 -名师归纳总结-第 9 页,共 35 页CMPAL,a。小于 a(小 A)退出JB EXIT CMPAL,zJA EXIT 。大于 z(小 z)退出SUB AL,20H 。小写变大写MOV DL,AL 。显示 MOV AH,2 INT 21H EXIT:MOV AH,4CH INT 21H 4.9 设有如下程序段:LLL:JC LLL 若 JC LLL 指令与 LLL:处指令间相隔 1000H 个存储单元,这个程序段将出现何种异常现象?如何改造这个程序段?转移超出范围,编译失败.可以给 JC 之后地语句加标号:NEXT,如下所示JC LLL NEXT:则程序改为:JNC NEXT JMP LLL NEXT:4.13 编写程序,当 DL 是奇数时使AL=30H,否则使 AL=31H.分析,如果 DL 是奇数,最低位应为1,将 DL 右移 1 位到 CF 中,CF 将为 1.NOT DL 。将 DL 最低位 1变 0,0 变 1 SHR DL,1 。将 DL 最低位移到CF 中 MOV AL,0 。AL 予清 0 RCLAL,1 。将 CF 移到 AL 最低位中ADDAL,30H 说明,本解巧妙地不使用条件语句达到题目要求.4.16 编写一个程序,把变量BUFX 和 BUFY 中较大者存入BUFZ;若两者相等,则把其中之一存入BUFZ 中.假设变量存放地是8 位无符号数.MOV AL,BUFX MOV BUFZ,AL 。予将 BUFX 放到 BUFZ 中CMP AL,BUFY JAE EXIT MOV AL,BUFY 。如果 BUFX 小XCHGAL,BUFZ 。将 BUFY 换到 BUFZ 中EXIT:MOV AH,4CH 4.17 BUFX、BUFY 和 BUFZ 是 3 个有符号16 进制数,编写程序实现(1)如果这 3 个数都不相等,则显示 0;精选学习资料 -名师归纳总结-第 10 页,共 35 页(2)如果这 3 个数中有两个数相等,则显示 1;(3)如果这 3 个数都相等,则显示 2.MOV CL,0 。计数MOV AX,BUFX CMP AX,BUFY JNE NEXT1 INC CL 。如果 BUFX 和 BUFY 相等,将 CL 加 1 NEXT1:MOV AX,BUFY CMP AX,BUFZ JNE NEXT2 INC CL 。如果 BUFY 和 BUFZ 相等,将 CL 加 1 NEXT2:MOV AX,BUFX CMP AX,BUFZ JNE NEXT3 INC CL 。如果 BUFX 和 BUFZ 相等,将 CL 加 1 NEXT3:CMP CL,3 JNE NEXT4 DEC CL 。如果 CL 为 3,减为 2 NEXT4:。4.18 已知三个无符号数A、B、C,存放在 ADR 开始地连续单元,编写程序完成下述功能,若 A、B、C 同时为偶数,将 FLAG单元置1;若同时为奇数,将 FLAG 单元置0;否则FLAG 单元置全 1.解法 1:如果 ABC 为字节类型:MOV CL,0 。计数MOV AL,ADR SHR AL,1 。右移 A,如果 A 为偶,CF 将为 0,否则为 1 JC NEXT1 INC CL 。A 为偶,将 CL 加 1 NEXT1:MOV AL,ADR+1 。字节类型加1 SHR AL,1 JC NEXT 2 INC CL 。B 为偶,将 CL 加 1 NEXT2:MOV AL,ADR+2 SHR AL,1 JC NEXT 3 INC CL 。C 为偶,将 CL 加 1 NEXT3:CMP CL,3 。以下判断CF,为 3,则将 FLAG 单元置 1 精选学习资料 -名师归纳总结-第 11 页,共 35 页 JNE NEXT4 MOV FLAG,1 JMP EXIT NEXT4:CMP CL,0 。以下判断CF,为 0,则将 FLAG 单元置 0 JNE NEXT5 MOV FLAG,0 JMP EXIT NEXT5:MOV FLAG,-1 EXIT:解法 2,如果 ADR 为字类型 MOV CL,0 MOV AX,ADR TEST AX,0001H 。与上一方法不同点,改为测试第0位 JNZ NEXT1 INC CL NEXT1:MOV AX,ADR+2 。字类型加2 TEST AX,0001H JNZ NEXT2 INC CL NEXT2:MOV AX,ADR+4 TEST AX,0001H JNZ NEXT3 INC CL NEXT3:CMP CX,0 JZ NEXT5 CMP CL,3 JZ NEXT4 MOV CL,0FFH JMP NEXT5 NEXT4:MOV CL,1 NEXT5:MOV FLAG,CL 4.20 要求A、B、C 三数地中间数(中间数即该数小于一数而大于另一数),其中A、B、C 及中间数地存储单元自行定义.假设 A、B 和 C 为无符号数,编写相关程序.若 A、B 和C 为有符号数,则应如何修改程序.A DB 39H B DB 54H C DB 6AH D DB?。只要将 A、B、C 从小到大排序,中间位置地就是中间数MOV AL,A CMP AL,B JBE NEXT1 精选学习资料 -名师归纳总结-第 12 页,共 35 页XCHG AL,B 。AB.交换 AB 地位置 MOV A,AL NEXT1:MOV AL,B CMP AL,C JBE NEXT2 XCHG AL,C 。BC.交换 BC 地位置 MOV B,AL NEXT2:MOV AL,A 。再比较 AB CMP AL,B JBE NEXT3 XCHG AL,B 。AB.交换 AB 地位置 MOV A,AL NEXT3:MOV AL,B MOV D,AL。有符号数题解见下题解,只将 JBE 换为 JLE 就可以了.4.21 已知 A、B 和 C 存放在ADR 开始单元,编制程序使之按递增顺序存放在NEW 开始地单元.设 A、B 和 C 为带符号数.MOV AL,A CMP AL,B JLE NEXT1 XCHG AL,B 。AB.交换 AB 地位置 MOV A,AL NEXT1:MOV AL,B CMP AL,C JLE NEXT2 XCHG AL,C 。BC.交换 BC 地位置 MOV B,AL NEXT2:MOV AL,A 。再比较 AB CMP AL,B JLE NEXT3 XCHG AL,B 。AB.交换 AB 地位置 MOV A,AL 4.23 编制程序计算:X*Y (Y=0,X=0)S XY (X0,Y0 XY(其它)设 X,Y 为双字节带符号数据,分别存放在DAX,DAY单元,计算结果存入RLT 单元.RLTDW?DAX DW?DAY DW?MOV CX,0 精选学习资料 -名师归纳总结-第 13 页,共 35 页MOV AX,DAX CMP AX,0 JL NEXT1 INC CX 。X=0 NEXT1:MOV BX,DAY CMP BX,0 JL NEXT2 INC CX 。Y=0 NEXT2:CMP CX,2 JZ NEXT3 。X*Y CMP CX,0 JZ NEXT4 。XY ADD AX,BX JO NEXT5 CMP AX,8000H JL NEXT5 NEG AX NEXT5:MOV DAX,AX JMP EXIT1 NEXT4:MOV DX,0 IDIV BX MOV DAX,AX JMP EXIT1 NEXT3:IMULBX MOV DAX,AX MOV DAY,DX EXIT1:4.24 编写程序,将一个包含有20 个有符号数据地数组ARRAYM分成两个数组,正数数组 ARRAYP 和负数数组ARRAYN,并分别把这两个数组中地数据个数显示出来.ARRAYM DB 20,48,149,212,33,200,198,23,25,53,199,214,225,245,123,1,12,43,54,165 COUNT EQU$-ARRAYM ARRAYP DB COUNT DUP(0)ARRAYN DB COUNT DUP(0)MOV BX,OFFSET ARRAYM 。源数据MOV SI,OFFSET ARRAYP 。存正数MOV DI,OFFSET ARRAYN 。存负数MOV DH,0 。正数个数MOV DL,0 。负数个数MOV CX,COUNT LOOP1:MOV AL,BX 。源数据中取1 个数SHL AL,1 。看最高位精选学习资料 -名师归纳总结-第 14 页,共 35 页JC NEXT1 。最高位为1 则 CF 为 1,有进位是负数MOV SI,AL 。存正数INC SI 。正数指针加1 INC DH 。正数个数加1 JMP NEXT2 NEXT1:MOV DI,AL 。存负数INC DI INC DL NEXT2:INC BX LOOP LOOP1 4.25 已知内存DATA 开始地存储区存放若干个字节数据,数据个数在COUNT 单元中存放.编制程序求其中正数平均值及负数平均值,并分别存入MEANP 和 MEANM单元.BUF DB 27H,59H,0B3H,32H,8AH COUNT EQU$-BUF MEANP DB?。存正数平均值MEANM DB?。存负数平均值LEA SI,BUF 。指向 BUF MOV CX,COUNT MOV DI,0 MOV BP,0 MOV DX,0 MOV BX,0 MOV AH,0 CLC 。清进位位L1:MOV AL,SI CMP AL,0 JL NEXT1 。负数在NEXT1 处理ADC DL,AL ADC DH 。正数加到DX 中INC DI 。正数个数加1 JMP NEXT2 NEXT1:NEG AL 。负数求其绝对值ADC BL,AL 。加到 BX 中ADC BH INC BP 。负数个数加1 NEXT2:INC SI 。准备取下一个数LOOP L1 NEG BX 。负数之和MOV CX,DI 。正数个数MOV AX,DX 。正数总和IDIV CL 。正数平均值精选学习资料 -名师归纳总结-第 15 页,共 35 页MOV MEANP,AL MOV AX,BX 。负数之和MOV CX,BP 。负数个数IDIV CL 。负数平均值MOV MEANM,AL 4.26 已知内存DATA 单元开始连续存放若干个字符,编制程序求这些字符中出现次数最多地字符,将其出现次数及ASCII 码分别存入NUMB 和 DATAM 单元.分析:如果每出现一个字符,就设置一个变量存放其出现次数,最后再找出现最多地字符,在循环过程中要不停地设置新变量,这样地程序不好设计.本解建立一个长度和ASCII 码表相等(127)地数组,每一元素地地址就对应一个ASCII 码值,每一元素存放该元素地址对应地ASCII 码代表地字符出现次数.找到一个字符,就以其ASCII 码值为地址,将该地址对应地存储单元中地数据加1.这样只对原串从始到终扫描一次,就能完成统计,再求最大值就容易了.这个方法我们称之为对号入座法.DATA SEGMENT A DB ASESRFGDGRESDSSDDSXDREGHRD43RBVFB2S3432 COUNT EQU$-A B DB 127 DUP(0)。对应某字符地ASCII 码地地址中存放该字符出现次数 NUMB DB 0 DATAM DB 0 DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX LEA SI,A 。指向字符串地指针 LEA DI,B 。存放相应字符出现次数 MOV CX,COUNT NEXT:MOV BL,SI 。取一个字符地ASCII 码到 BX 中 MOV BH,0 INC BBX。对应某字符地ASCII 码地地址中存放该字符出现次数加1 INC SI LOOP NEXT。完成对所有字符地统计,以下求出现次数最多地 MOV SI,0 MOV CX,127 MOV DL,0 NEXT1:CMP DL,BSI 。求 B 区中最大地数 JAE NEXT2 MOV DL,BSI MOV DI,SI NEXT2:INC SI LOOP NEXT1 精选学习资料 -名师归纳总结-第 16 页,共 35 页 MOV NUMB,DL MOV AX,DI MOV DATAM,AL DATAM ADD DL,30H 。显示 B 区中最大地数 MOV AH,2 INT 21H MOV DX,DI 。相应地址数送DL 准备显示出现最多地那个字符 MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START 4.27 已知内存WORD 单元开始存放两个字母个数相同地英文单词,词间用逗号分隔,编制程序将两个单词按字典顺序存放在DICT 开始地存储区.分析:比较二个串地大小应当从第一个字符开始比较,直到找到一个不相同地字符为止,此时那个串地该字符大,该串就大,要排在后面.本程序先找大串,找到后将小串传DICT,再将大串接传DICT,最后显示DICT 串.如果二串到最后一个字符还是一样大,表示二串一样大,则不移动原串,直接显示ORD1 串.方法 1,用传送指令完成DATA SEGMENT WORD1 DB PRINT,PRINT COUNT EQU($-WORD1)/2 DICT DB COUNT*2 DUP(0)DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX LEA SI,WORD1 。指向第一个字符串地指针 LEA DI,WORD1+COUNT 。存放相应字符出现次数 MOV CX,COUNT NEXT1:MOV BL,SI 。取一个字符地ASCII 码到 BX 中 CMP BL,DI JA NEXT2 。如果找到第一个不相同地字符前串大转next1 JB NEXT5 。如果找到第一个不相同地字符前串小转next2 INC SI INC DI LOOP NEXT1。如果字符相同继续向下找不同字符,完成对所有字符地统计 LEA DI,WORD1 。以下显示原WORD1 串精选学习资料 -名师归纳总结-第 17 页,共 35 页 MOV CX,COUNT*2 JMP NEXT8。如果二串相同,转退出程序显示原WORD1 串NEXT2:LEA SI,WORD1+COUNT 。先将较小地后串转存DICT,再将较大地前串转存DICT MOV CX,COUNT LEA DI,DICT NEXT3:MOV BL,SI MOV DI,BL INC SI INC DI LOOP NEXT3 LEA SI,WORD1 MOV CX,COUNT NEXT4:MOV BL,SI MOV DI,BL INC SI INC DI LOOP NEXT4 JMP NEXT7 。排完序后转显示NEXT5:LEA SI,WORD1 。原串顺序已经符合字典顺序,直接全部转存DICT MOV CX,COUNT*2 LEA DI,DICT NEXT6:MOV BL,SI MOV DI,BL INC SI INC DI LOOP NEXT6 NEXT7:LEA DI,DICT 。以下显示排好序地DICT 串 MOV CX,COUNT*2 NEXT8:MOV DL,DI MOV AH,2 INT 21H INC DI LOOP NEXT8 MOV AH,4CH INT 21H CODE ENDS END START 方法 2,用串操作指令完成DATA SEGMENT WORD1 DB PRINT,PRINT COUNT EQU($-WORD1)/2 DICT DB COUNT*2 DUP(0)DATA ENDS 精选学习资料 -名师归纳总结-第 18 页,共 35 页STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,ES:DATA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,WORD1 。指向第一个字符串地指针 LEA DI,WORD1+COUNT 。存放相应字符出现次数 MOV CX,COUNT CLD 。清 DF REPZ CMPSB。NEXT1:MOV BL,SI。取一个字符地ASCII 码到 BX 中。CMP BL,DI JA NEXT2 。如果找到第一个不相同地字符前串大转next1 JB NEXT5 。如果找到第一个不相同地字符前串小转next2。INC SI。INC DI。LOOP NEXT1 LEA SI,WORD1 。以下显示原WORD1 串 MOV CX,COUNT*2 JMP NEXT8。如果二串相同,转退出程序显示原WORD1 串NEXT2:LEA SI,WORD1+COUNT。将后串转存DICT,再将前串转存DICT MOV CX,COUNT LEA DI,DICT。NEXT3:MOV BL,SI。MOV DI,BL。INC SI。INC DI。LOOP NEXT3 REP MOVSB LEA SI,WORD1 MOV CX,COUNT 。NEXT4:MOV BL,SI。MOV DI,BL。INC SI。INC DI。LOOP NEXT4 REP MOVSB JMP NEXT7 。排完序后转显示NEXT5:LEA SI,WORD1 。原串顺序已经符合字典顺序,直接全部转存DICT MOV CX,COUNT*2 LEA DI,DICT 精选学习资料 -名师归纳总结-第 19 页,共 35 页。NEXT6:MOV BL,SI。MOV DI,BL。INC SI。INC DI。LOOP NEXT6 REP MOVSB NEXT7:LEA SI,DICT 。以下显示排好序地DICT 串,欲使用 LODSB,要用 SI 指针MOV CX,COUNT*2 NEXT8:LODSB 。MOV DL,DI MOV DL,AL MOV AH,2 INT 21H。INC DI LOOP NEXT8 MOV AH,4CH INT 21H CODE ENDS END START 4.28 编制程序求X、Y 地最小公倍数并存入CMTM单元,已知 X、Y 为字节类型正整数且分别存放在ADRX 和 ADRY 单元.分析:求最小公倍数地数学方法是找出X 和 Y 地所有因子,再将所有相同地因子取其一个,连同所有不同地因子乘起来,乘积就是.另外一种方法是数值之积除以最大公约数,这时要求先求最大公约数,方法是辗转相除法:始终用较大数除以较小数,然后用余数代替较大数,整除时地除数就是最大公约数.方法3:用大数翻倍法,将较大数依次乘2、3、4,到某个积能整除较小数时该积就是最小公倍数.以下分别用2、3 二种方法来解.数值之积除以最大公约数方法:(要求最小公倍数之大小不超过1 个字大小)假定 XY,如果 XAX。存放 ASCII 码值末地址=SI。出口参数:在ASC 开始地存贮单元中。*TRANSFORM PROC NEAR PUSH CX PUSH DX PUSH BX MOV CX,5 。最多 5位数 MOV BX,10 。除数为10 MOV DX,0 AGAIN:DIV BX MOV SI,DL ADD SI,BYTE PTR 30H 。余数变ASCII 码放 SI 所指位置 DEC SI MOV DX,0 LOOP AGAIN MOV CX,5 。最多 5位数NEXT:INC SI MOV DL,SI MOV AH,2 INT 21H LOOP NEXT POP BX POP DX POP CX RET TRANSFORM ENDP 精选学习资料 -名师归纳总结-第 22 页,共 35 页 CODE ENDS END START 大数翻倍法:DATA SEGMENT X DW 200 Y DW 44 BUF DB 6 DUP(0)DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,ES:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV CX,Y 。最小公倍数最大为X 与 Y 地乘积,因此试到乘数为Y 为止 MOV BX,2 。乘数从2 开始试LOOP1:MOV AX,X MUL BX 。求 X 与 BX 地乘积,看该乘积能否被Y 除尽 PUSH AX 。保存该乘积,如果是最小公倍数就送显示 DIV Y 。看 X 与 BX 地乘积能否被Y 除尽 CMP DX,0 POP AX JZ NEXT2 。如果除尽,表示找到最大公约数(等于AX 中数)INC BX 。未找到最大公约数将BX 中数加 1 后继续LOOP LOOP1 NEXT2:LEA SI,BUF+5 。调 10 进制显示程序 CALL TRANSFORM MOV AH,4CH INT 21H。*。子程序名:TRANSFORM。功能:将16 位无符号二进制数转换为十进制数ASCII 码显示。入口参数:16位二进制数=AX。存放 ASCII 码值末地址=SI。出口参数:在ASC 开始地存贮单元中。*TRANSFORM PROC NEAR 精选学习资料 -名师归纳总结-第 23 页,共 35 页 PUSH CX PUSH DX PUSH BX MOV CX,5 。最多 5位数 MOV BX,10 。除数为10 MOV DX,0 AGAIN:DIV BX MOV SI,DL ADD SI,BYTE PTR 30H 。余数变ASCII 码放 SI 所指位置 DEC SI MOV DX,0 LOOP AGAIN MOV CX,5 。最多 5位数NEXT:INC SI MOV DL,SI MOV AH,2 INT 21H LOOP NEXT POP BX POP DX POP CX RET TRANSFORM ENDP CODE ENDS END START 分析:第二个程序比较短小、简单,容易设计,但可能会比较慢.4.29 采用查表法,将 0 到 15 中某数变为十六进制数字地ASCII 码,并将结果用16 进制形式显示出来.DATA SEGMENT X DB 13 TABEL DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,ES:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV BL,X 。取数,8 位 2 进制数放 BL 中精选学习资料 -名师归纳总结-第 24 页,共 35 页MOV BH,0 。准备用BX 间址,因而将 BH 清 0 MOV DL,TABELBX 。查表MOV DH,0 MOV SI,DX 。所用子程序显示一个字,如果只显示8 位,需另设计子程序 CALL DISPLAY16 MOV DL,H MOV AH,2 INT 21H MOV AH,4CH INT 21H。子程序名:DISPLAY16。功能:以移位方式显示16 进制数。占用寄存器:BX,CL,AX,DX(均已保护)。输入参数:要显示数据在SI 中。输出参数:无DISPLAY16 PROC PUSH AX PUSH BX PUSH CX PUSH DX MOV BX,4 。每个字显示4 个 16 进制字符CHANGE10:MOV CL,4 。准备左移4位(除以16)ROL SI,CL 。SI 循环移 4 位 MOV DX,SI 。转存到DX AND DX,0FH 。清高 12 位 ADD DL,30H 。一个 16 进制数变为ASCII 码值 CMP DL,3AH 。是否小于10?JB CHANGE12 。如果小于10 转显示 ADD DL,7 。否则为 A 到 F 之间数,加 7 CHANGE12:MOV AH,2 。显示 1 个字符 INT 21H DEC BX 。处理下一个字符 CMP BX,0 。是否为0?JNZ CHANGE10 。不为 0 转 CHANGE10 POP DX POP CX POP BX POP AX RET DISPLAY16 ENDP 精选学习资料 -名师归纳总结-第 25 页,共 35 页 CODE ENDS END START 4.30 编制程序求一组数据中地最大值与最小值及其存放地址.分析:假定数据均为无符号数.在数据区准备4 个变量分别存放最大值、最小值、最大值存放地址与最小值存放地址,初始值为0、OFFFFH、0、0.从第一个数开始将数据放到AX 中,分别与最大值、最小值比较,如果出现新地最大值、最小值,就代换有关变量地值.DATA SEGMENT X DW 2314H,122AH,3A5BH,33EDH,0A344H,4453H,3EDAH,6ADEH COUNT EQU ($-X)/2 。X 中字地个数 MAX DW 0 MIN DW 0FFFFH MAXADDI DW 0 MINADDI DW 0 DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,ES:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET X MOV CX,COUNT NEXT:MOV AX,SI CMP AX,MAX JNA NEXT1 MOV MAX,AX MOV MAXADDI,SI NEXT1:CMP AX,MIN JNB NEXT2 MOV MIN,AX MOV MINADDI,SI NEXT2:ADD SI,2 LOOP NEXT MOV SI,MAX CALL DISPLAY16 MOV SI,MIN CALL DISPLAY16 MOV AH,4CH INT 21H。子程序名:DISPLAY16。功能:以移位方式显示16 进制数精选学习资料 -名师归纳总结-第 26 页,共 35 页。占用寄存器:BX,CL,AX,DX(均已保护)。输入参数:要显示数据在SI 中。输出参数:无DISPLAY16 PROC PUSH AX PUSH BX PUSH CX PUSH DX MOV BX,4 。每个字显示4 个 16 进制字符CHANGE10:MOV CL,4 。准备左移4位(除以16)ROL SI,CL 。SI 循环移 4 位 MOV DX,SI 。转存到DX AND DX,0FH 。清高 12 位 ADD DL,30H 。一个 16 进制数变为ASCII 码值 CMP DL,3AH 。是否小于10?JB CHANGE12 。如果小于10 转显示 ADD DL,7 。否则为 A 到 F 之间数,加 7 CHANGE12:MOV AH,2 。显示 1 个字符 INT 21H DEC BX 。处理下一个字符 CMP BX,0 。是否为0?JNZ CHANGE10 。不为 0 转 CHANGE10 POP DX POP CX POP BX POP AX RET DISPLAY16 ENDP CODE ENDS END START 4.31 内存自BUFF 单元开始地存储区连续存放100 个学生地某科分数,编制循环程序统计 100,9099,8089,7079,60 69,5059,4049,3039,20 29,1019,09 等各分数段地学生人数,并把结果连续存放在RESULT 开始地单元.分析:如果对每一个数都判断属于那个段,再将相应地变量加1,程序太麻烦.可以类似于 4.26题采用对号入座法.准备一个数组,长 11,其中各元素分别对应某个分数段地人数.可以依次取分数,除以10,以商为数组中相对开始元素地偏移地址,将该地址中数加1,就可以完成统计.DATA SEGMENT X DB 64,87,98,56,34,100,99,36,68,76,78,66,0,0 COUNT EQU$-X 。X 中分数地个数 TABEL DB 11 DUP(0)。统计各个分数段人数 BUF DB 5 DUP(0)。十进制显示程序用精选学习资料 -名师归纳总结-第 27 页,共 35 页DATA ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DA TA,ES:DA TA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET X MOV CX,COUNT MOV BL,10 。除数,除以 10 NEXT1:MOV AL,SI MOV AH,0 DIV BL MOV AH,0 MOV DI,AX INC TABELDI INC SI LOOP NEXT1 MOV DI,OFFSET TABEL 。以下准备显示各分数段地人数情况 MOV CX,11 。从 0 到 100 共分 11个分数段NEXT2:MOV AL,DI MOV SI,OFFSET BUF CALL TRANSFORM1 MOV DL,MOV AH,2 INT 21H INC DI LOOP NEXT2 MOV AH,4CH INT 21H。*。子程序名:TRANSFORM1。功能:将8位无符号二进制数转换为十进制数格式显示。入口参数:8 位二进制数=AL。存放 ASCII 码值末地址=SI。出口参数:。*TRANSFORM1 PROC NEAR PUSH CX PUSH DX PUSH BX 精选学习资料 -名师归纳总结-第 28 页,共 35 页 PUSH DI MOV CX,3 。最多 3位数 MOV BX,10 。除数为10 MOV DI,0 AGAIN:MOV AH,0 DIV BL MOV SI,AH 。余数存显示数据区 ADD SI,BYTE PTR 30H 。余数变ASCII 码放 SI 所指位置 INC DI 。余数个数计数,为显示准备 DEC SI CMP AL,0 。如果商已经为0,就不再求余了 JZ NEXT0 LOOP AGAIN 。完成求余数过程NEXT0:MOV CX,DI NEXT:INC SI MOV DL,SI MOV AH,2 INT 21H LOOP NEXT POP DI POP BX POP DX POP CX RET TRANSFORM1 ENDP CODE ENDS END START 4.32 下列程序执行完后,物理地址单元01070H 地内容是什么?MOV AX,00E0H 。设置 DS 段地址为00E0H MOV DS,AX MOV BX,0200H 。BL 从 0 开始MOV CX,BX 。共计 200H 个单元NEXT:MOV BX,BL 。开始是0 放到 E0H:200H 中INC BL 。以后是 1 放到 E0H:201H 中LOOP NEXT 。直到 200H 放到 E0H:400H 中MOV AH,4CH INT 21H 从上面分析可见,从 E00H+200H=01000H到 E00H+400H=01200H中顺序放0 到 200H,因此推断,物理地址单元01070H 地内容是70H.4.33 设 CX 寄存器中存放数据为100H,SI 寄存器中存放数据为100H,DI 寄存器中存放数据为 2000 H,数据段中偏移地址 100 H 处开始存放有 100 H 个字节数据,附加段中偏移址精选学习资料 -名师归纳总结-第 29 页,共 35 页2000 H 处开始存放有另 100 H 个字节数据.这时执行 REPNZ CMPSB 指令,问:(1)指令结束条件是什么?结束条件是(CX)=0 或(CX)0 但 ZF0,即出现了比较值为0(比较地二字符相同)地情况.得到结论是:一种可能是CX 为 0,数据段中偏移地址 100 H 处开始地长度为 100 H 个字节地串和附加段中偏移址2000 H 处起地同样长度地串对应字符全都不相同.另一种可能是CX 不为 0,那么在数据段中偏移地址100 H 处开始地串从串尾倒数(CX)地字符和附加段中偏移址2000 H 处起地对应位置地字符是相同地.(2)指令执行前若 DF=0,指令结束后,上述三个寄存器内容有何关系?如 果(CX)=0,那 么(SI)=200H,(DI)=2100H;如 果(CX)0,那么,(SI)=200H-(CX),(DI)=2100H-(CX).4.34 阅读下面地程序段,描述其完成地功能.LEA BX,BUF MOV CX,N MOV AX,0LOPA:CMP BYTE PTR BX,0 JGE NEXT INC AXNEXT:INC BX LOOP LOPA 本程序段分析BUF 中 N 个字节数据,统计其中负数地个数放到AX 中.4.35 如何使 DF 标志清零,这时会带来何种影响?如何使 DF 标志置 1,这时又会带来何种影响?CLT 使 DF 标志清零,在串操作中每一步操作之
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!