有答案的汇编习题(6)

2019-08-31 19:45

PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX

MOV SI,OFFSET BCDBUF MOV DI,OFFSET ASCBUF CLD ;增量方向 TRANT: LODSB MOV BL,AL AND AL,0FH OR AL,30H ;低位十进制数—>ASCII码 STOSB MOV AL,BL PUSH CX MOV CL,4 SHR AL,CL ;右移四位

POP CX OR AL,30H ;高位十进制数—>ASCII码 STOSB LOOP TRANT RET COSEG ENDS

END START 6、算法1:两两比较

1、从存储单元分别取出x,y,z.

2、将x与y进行比较,小者为d,大者为e. 3、将z与d比较,若z不大于d,则d为中间值。 4、若z大于d,再将z与e进行比较,小者为中间值。 5、存中间值。

编写程序:使用直接寻址方式存取数据。x,y,z和中间结果d,e分别存放于寄存器AH、AL、BH、BL和CH中。参考程序如下: MOV AH,DATA MOV AL,DATA+1 MOV BH,DATA+2 CMP AH,AL JAE LP1 MOV BL,AH MOV CH,AL JMP LP2 LP1: MOV BL,AL

MOV CH,AH LP2: CMP BH,BL JAE LP3 MOV AL,BL JMP SAV LP3: CMP BH,CH JB LP4 MOV AL,CH JMP SAV LP4: MOV AL,BH SAV: MOV BUF,AL HLT 算法2:比较换位

我们假设x,y,z分别被存放于AL,BL,CL寄存器中,且AL中总是存放中间数。采用两数比较换位的方法,就可以最终在AL中得到中间数值。程序如下: MOV AL,DATA MOV BL,DATA+1 MOV CL,DATA+2 CMP AL,BL JB LP1 XCHG AL,BL LP1: CMP AL,CL JAE SAV XCHG AL,CL CMP AL,BL JB SAV XCHG AL,BL SAV: MOV BUF,AL HLT

注:程序中利用交换指令XCHG实现换位,以保证AL中总是中间值。

7、此类题目属于多条件多分支类型。对于正负数的判断,在上例中已有说明。而对于奇偶数的判断,只要判断最低位D0即可。若为0则为偶数,为1则为奇数。判断的顺序可以有两种。一种是先判正负,再判奇偶;另一种是先判奇偶,再判正负。我们选其中一种用程序实现。 程序如下: MOV AL,DAT AND AL,DAT JNS POSI TEST AL,01H JZ M OR AL,BUF JMP DONE M: XOR AL,BUF JMP DONE POSI: TEST AL,01H

JZ N ADD AL,BUF JMP DONE N: AND AL,BUF DONE: MOV BUF,AL HLT

注:以上程序是先判正负,再判奇偶。

8、这是一个多分支问题。我们只需将AL中的内容分别与字符A,B和E的ASCII码相比较,就可以确定所要转向的地址。

查ASCII码表可知:字符A的ASCII码为41H; 字符B的ASCII码为42H; 字符C 的ASCII码为45H. 编程如下:

CMP AL,41H JE LPA CMP AL,42H JE LPB CMP AL,45H JE LPE JMP LPN

9、本题为分支加简单运算。判断条件在零的左右,分支有三条, 程序如下:

MOV AL,DATA OR AL,AL JZ L1 JNS I1 DEC AL JMP L1 I1: INC AL L1: MOV Y,AL HLT

10、解决本题的方法有多种,其中最简单的方法是依次比较两个数组中的数据,小数存入C数组,直至两个数组中所有数据比较、处理完毕。具体操作过程为:

用a1与b1比较,若a1小,则将a1存入C,再用a2与b1比较;否则,将b1存入C,再用a1与b2比较,比较之后仍将小数存入C,大数与小数的下一个数再进行比较。这种不断重复的操作过程可用以下形式来说明: TOP ai与bj比较(i,j=1,2,3,…,20) 若ai≤bj 则ai—>Cz(z=1,2,3,…,40) i+1—>i,转TOP 若ai>bj 则bj—>Cz j+1—>j,转TOP

当然,在编程时还需要有i,j,z的结束控制来完善上述的重复操作过程。参考程序如下: SSEG SEGMENT STACK ‘STACK’ STR DB 100 DUP(?) SSEG ENDS

DATA SEGMENT

A DB ‘……’ B DB ‘……’ C DB 40 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:SSEG START: MOV AX,DATA MOV DS,AX MOV EX,AX LEA SI,A LEA DI,B LEA BX,C MOV AH,0 MOV CH,20 MOV CL,CH LP: CMP CH,0 JZ SB CMP CL,0 JNZ LP1 MOV AL,[SI] JMP SA LP1: MOV AL,[SI] CMP AL,[DI] JG SB SA: MOV [BX],AL INC SI DEC CH JMP NEXT SB: MOV AL,[DI] MOV [BX],AL INC DI DEC CL NEXT: INC BX INC AH CMP AH,40 JNZ LP DONE: MOV AH,4CH INT 21H CODE ENDS

END START

11、本题所要做的工作是将100个连续单元逐一清零。采用循环的方法最为简单。设置一个循环计数器,每清完一个单元,计数器减1,然后判断计数器是否为0,不为0则再去清一个存储单元,否则清零工作完成。

一般情况下,已知循环次数的,循环判断放在循环体的后面。未知循环次数但已知结束条件的,循环判断置于循环体的前面。 编程如下:

LEA BX,BUF MOV CL,64H LP: MOV [BX],0 INC BX DEC CL JNZ LP HLT

注:以上采用字节操作,每次清一个存储单元。也可以采用字操作,每次清两个存储单元。 程序如下:

LEA BX,BUF MOV CX,0032H MOV AX,0 LP: MOV [BX],AX ADD BX,2 LOOP LP HLT

注:当不知道所清单元个数但已知结束条件时,可编程序如下: LEA BX,BUF MOV AL,0FFH LP: CMP AL,[BX] JE DONE MOV [BX],0 INC BX JMP LP DONE: HLT

12、判断数据的正负由每个字节数的最高位来决定。因此,可以对每个字节数进行一次自身的“与”操作,运算结果仍是数据本身不变,但要影响SF标志。因为符号标志SF总与逻辑运算结果的最高位(符号位)相同。当然,利用逻辑测试指令TEST加上对ZF标志的判断也能完成字节数正负的判断。 程序如下:

10 MOV CX,0064H 20 LEA BX,DAT 30 MOV AH,0 40 LP: MOV AL,[BX] 50 AND AL,[BX] 60 JNS LP1 70 INC AH 80 LP1: INC BX 90 LOOP LP 100 MOV MNUM,AH 110 HLT


有答案的汇编习题(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018-2024年中国建筑装饰行业分析报告(目录) - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: