有答案的汇编习题(7)

2019-08-31 19:45

该程序执行100次循环。循环体是从40行开始,到90行结束。循环次数由CX寄存器控制,其初值等于数据块长度。每循环一次,CX的内容减1。循环100次后,CX的内容等于0,结束循环。程序每循环一次,完成对数列中一个数的检查。在循环体中又含有一个条件转移指令,是用符号标志SF直接判断被检查的数是否负数,若是负数,寄存器AH加1;若为正数,满足转移条件,程序转移,AH内容不变并继续对数列的下一个数进行检查。

13、由题目已知数列长度为3,将其存入CX寄存器,用于计循环次数。数列之和存于BUF和BUF+1单元中。使用字操作可以简化程序。 程序如下:

10 MOV CX,3 20 LEA BX,DAT 30 MOV AX,0 40 MOV DX,AX 50 LP: MOV DL,[BX] 60 ADD AX,DX 70 INC BX 80 LOOP LP 90 MOV BUF,AX 100 HLT

注:该程序有三次循环。每次循环从50行开始至80行结束,这部分为循环体。循环次数由CX计数器来控制。由于计算累加是使用的字操作,也就省略了字节相加时对进位的处理,从而简化了程序。 14、这是一个典型的多分支带循环的问题。 程序如下:

MOV CX,0064H LEA BX,NUMB MOV AX,0 MOV COUNT,AX MOV COUNT+2,AX LP: MOV AL,[BX] CMP AL,100 JE L100 CMP AL,60 JC L60 INC COUNT JMP NEXT L100: INC COUNT+1 JMP NEXT L60: OR AL,AL JZ L0 INC AH CMP AH,11 JNC DONE1 JMP NEXT L0: INC COUNT+2 LOOP LP

JMP DONE DONE1: MOV COUNT,0FFH DONE: HLT

15、数据块的传送应首先考虑覆盖问题。如无覆盖,则正向、反向传送均可。如有覆盖区,则必须使用反向传送,以防止破坏数据区原有内容。 程序如下:

方法一:正向传送: MOV AX,0 MOV CX,0064H LEA SI,ADAT LEA DI,BDAT

LP: MOV AL,[SI] MOV [DI],AL INC SI INC DI LOOP LP HLT 方法二:反向传送: MOV AX,0 MOV CX,0064H LEA SI,ADAT+63H LEA DI,BDAT+63H LP: MOV AL,[DI] MOV [SI],AL DEC SI DEC DI LOOP LP HLT 方法三:串传送:

MOV SI,OFFSET ADAT MOV DI,OFFSET BDAT MOV CX,100 CLD

REP MOVSB HLT

16、本题需另开辟一个数据区,长度与原数据区相同。将原数据区中经过判断的奇数放在新数据区的低地址单元,偶数放在高地址单元。待原数据区所有数据判断完毕,新数据区也就装满了。再将新数据区全部数据送回原数据区。程序开始要在新数据区设置两个指针。一个指针向数据区头,用于指示奇数存放单元。另一个指向数据区尾,用于指示偶数存放单元。两个指针相向移动。 编程如下:

SSEG SEGMENT STACK ‘STACK’ STA DB 100 DUP(?) SSEG ENDS DATA SEGMENT

BUF DB 50 DUP(?) NEWD DB DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:SSEG START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA BX,BUF LEA SI,NEWD LEA DI,NEWD+49 MOV CX,50 LP: MOV AL,[BX] TEST AL,01H JZ PP MOV [SI],AL INC SI JMP NEXT PP: MOV [DI],AL DEC DI NEXT: INC BX LOOP LP LEA SI,NEWD LEA DI,BUF MOV CX,50 CLD REP MOVSB DONE: MOV AH,4CH INT 21H CODE ENDS END START

17、本题需要从A地址起判断每一个字符是否为数字,若是则删除并将其后剩余字符依次向前递补,再将递补前最后一个字符位置用空格符(FFH)代替;否则判断下一个字符,判断后的操作同上,直至字符串所有字符判断完毕。 参考编程如下:

LEA BX,A ;字符串首地址送BX MOV CL,30 ;字符串长度送CL LP1: MOV AL,[BX] ;取1个字符 CMP AL,30H

JC NEXT ;小于30H,转NEXT CMP AL,3AH

JNC NEXT ;大于39H,转NEXT MOV DI,BX ;是数字,做递补准备 MOV SI,DI

INC SI MOV CH,CL

LP2: MOV AH,[SI] ;依次递补 MOV [DI],AH INC SI INC DI DEC CH

JNZ LP2 ;未完,继续递补 MOV [SI],0FFH ;完成递补,最后补空格符 NEXT: INC BX DEC CL

JNZ LP1 ;字符串未完,转LP1继续 HLT ;结束

注:在上面的程序中看不到专门删除数字符的指令操作,这是因为只要是数字符,就要进行向前递补操作,当递补操作结束后,原来数字符位置已由其后面的字符覆盖,起到了实际上的删除作用。所以,没有必要再进行额外的删除操作。

18、通过题目要求,我们可以发现,每一单项的计算(乘法)过程是相同的,只是乘数与被乘数的值不同而已。这样,我们就可以将乘法操作用一个子程序来完成。乘数和被乘数在主程序中确定。 程序如下: MOV AX,0 MOV RES,AX LEA BX,NUMB MOV AL,2 CALL SUBS MOV AL,3 INC BX CALL SUBS MOV AL,5 INC BX CALL SUBS HLT

SUBS PROC NEAR MUL [BX] ADD RES,AX MOV AX,0 RET

上面的程序在主程序部分使用了三次子程序指令,而实际上这三次如果使用循环的话只用一条即可完成。源程序如下:

SSEG SEGMENT STACK ’STACK’ STA DB 100 DUP(?) SSEG ENDS DATA SEGMENT NUMB DB 3 DUP(?) MUD DB 2,3,5

RES DW 0 DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:SSEG START: MOV AX,DATA MOV DS,AX MOV AX,0 MOV CX,3 LEA BX,NUMB LEA DI,MUD LP: MOV AL,[DI] CALL SUBS INC BX INC DI LOOP LP MOV AH,4CH INT 21H SUBS PROC NEAR MUL [BX] ADD RES,AX MOV AX,0 RET SUBS ENDP CODE ENDS

END START

这个程序与前一个比较起来似乎并不简单,但如果题目中所要求进行运算的项数比较多时,这个程序的通用性和高效率就会显现出来了。

19、作为一个通用子程序,就必须要把子程序中要用到的寄存器原值内容保存起来。在子程序工作结束后恢复它们,然后返回。但是应该注意的是:如果使用寄存器在主程序和子程序之间传送参数的话,那么该寄存器的值就不一定要保存。特别是用来向主程序回送结果的寄存器,就更不应该因保存和恢复寄存器而破坏了应该向主程序传送的信息。 程序如下:

SSEG SEGMENT STACK ‘STACK’ STA DB 100 DUP(?) SSEG ENDS DATA SEGMENT

NUB DB 4 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:SSEG SUBS PROC PUSH AX PUSH BX PUSH DI


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

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

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

马上注册会员

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