2022年汇编语言程序设计程学先汇编第,章作业参考答案 .pdf
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 。出口参