有答案的汇编习题(5)

2019-08-31 19:45

12. 可用的指令如下:

MOV DX,BLOCK+(6-1)*2 13. AX=0FFH BX=0。 14. BX=0FFH CX=0FFH。 15. MOV AX,10

MOV BL,10 MOV CL,1

16. (1)两条指令都是合法指令。第一条指令取得NAMES的偏移地址,第二条指令使用间接寻址方

式,将地址为DS*10H+BX+5字节中的数据传送给AL,结果AL=20。

(2)这条指令不正确。因为NAMES的属性为字节,而目的寄存器为AX,所以类型不匹配。 (3)这是一条合法指令。指令中将已定义的字节变量用伪操作PTR改变为字类型,所以避免了类型不匹配的错误。操作结果AX=4D4FH,即M和O的ASCII码。

(4)前两条指令使用的是立即数方式,第三条指令的源操作数字段使用的是基址变址寻址方式,但形成的数据地址中的数据属性为字节,而源操作数寄存器为AX,故出现类型不匹配错误,如AX改为AL,则这条指令就是合法指令。

(5)前两条指令是正确的,后两条指令有错误。在汇编过程中,OFFSET操作将得到变量的偏移值,但对基址变址方式形成的值在汇编指令时还是未知的。同样,诸如

MOV BX,OFFSET NAMES[SI]也是错误指令。第四条指令中,AX不能作为基址寄存器用。 (6)四条指令均为合法指令。第三条指令中的DI取得一个字节地址:BX+SI+NAMES,然后再按DI中的偏移地址,在数据段中将一字节内容传送给AL寄存器。操作结果AL=30.

17. 汇编时,汇编程序默认无标记数为十进制数;而运行时,DEBUG程序默认无标记数为16进制数。

经过分析,各行语句的初始地址及内容如下: 初始地址 内容 0000 =0064 =0078

2F 78 79 7A 2F 0D 0A 0007 05 13 61 0010

000A 11[20] 001B 90

001C 3132 000D 001A 0333 0078 000A

0026 000F =0028 0028 18. MAX=0FFFH

VALONE=000FH(VALONE为MAX的值除以10H的余数) VALTWO=001EH(000FH*2=001EH)

BUFSIZ=0020H(因为VALTWO=001EH>10H,则VALTWO GT 10H结果为真,表示为0FFFFH,再和10H相与,结果为10H,最后加上10H,取得值20H

BUFEND=001FH(数据区BUFFER最后一个字节的地址值) 19. DATA_SEG SEGMENT ;定义数据段

WORD ;段界为字

PUBIC ;该数据段为组合类型

'DATA' ;类别为\故按题目要求,该段的定义语句应写为: DATA_SEG SEGMENT WORD PUBLIC 'DATA' 20. (1)MOV AX,OFFSET LNAME

(2)MOV SI,WORD PTR CODE_LIST (3)CODE_LENGTH EQU $-CODE_LIST 21. (1)10025 (2)25 (3)2548

(4)3 (5)103 (6)1 (7)1 (8)3 22. 汇编后的结果如下:

(1) ADD SI,2 (2) MOV CX,100 (3) MOV CX,1

23. 三组指令均有错误,现改正如下:

(1)STACK_SEG SEGMENT STACK 'STACK' (2)SEG_CODE SEGMENT 'CODE' (3)MAIN_PROC ENDP SEG_CODE ENDS END START

24. 变量BUF为字节类型,所在段的段首地址为DATA,偏移地址为0。语句\

将紧跟它后面的字节类型的变量BUF重新定义为双字类型,并命名为DDBUF。变量DDBUF与BUF具有相同的段属性和偏移地址属性。而语?quot;DWBUF EQU WORD PTR BUF\是将变量BUF重新定义为字类型,并命名为DWBUF,变量DWBUF也与BUF具有相同的段属性和偏移地址属性。由此可见,DDBUF、BUF、DWBUF为同一数据存储区的首址,只是类型分别为双字、字节、字。 25. 分析以上数据段中各语句的功能,可知变量BUF的偏移地址为10,NUM的偏移地址为19。 26. END是为计算数组长度而建立的符号地址,所需指令如下:

MOV CX,(END-ARRAY)/2

汇编程序在汇编期间将计算表达式而形成指令 MOV CX,7 27. 源文件如下:

;PROGRAM TITLE GOES HERE--EX_MOVS ;程序名为EX_MOVS ;******************************************* DATA SEGMENT ;定义数据段 SOURCE_BUFFER DB 40 DUP('A') DATA ENDS

;******************************************** EXTRA SEGMENT ;定义附加段 DEST_BUFFER DB 40 DUP(?) EXTRA ENDS

;******************************************** CODE SEGMENT ;定义代码段

;********************************************* MAIN PROC FAR ;主程序部分 ASSUME CS:CODE,DS:DATA,ES:EXTRA

START:

PUSH DS ;保存原数据段地址

SUB AX,AX ;将AX清0并入栈 PUSH AX

PUSH AX,DATA ;数据段地址送DS MOV DS,AX

MOV AX,EXTRA ;附加段地址送ES MOV ES,AX

LEA SI,SOURCE_BUFFE ;将源地址偏移量送SI LEA DI,DEST_BUFF ;将目标地址偏移量送DI CLD ;清方向标志,使其递增 MOV CX,40 ;将传送字符数送CX REP MOVSB ;传送字符 RET ;返回 MAIN ENDP

;------------------------------------------------------------------------------------- CODE ENDS

;************************************************************ END START

28. 两个有符号加数及和我们均可在数据段内为其进行定义和预置。当求得的和非负时存入结果单元;

若和为负则求反后再存入结果单元。另外我们还可以用TITLE给出标题,用

END START表示程序结束。 TITLE ABSOLT ;标题

DATA_SEG SEGMENT ;定义数据段 OPER1 DW 1110B ;定义两个加数 OPER2 DW 11100111B ;

RESULT DW ? ;预置结果空间 DATA_SEG ENDS ;数据段结束 CODE_SEG SEGMENT ;定义代码段 ASSUME CS:CODE_SEG,DS:DATA_SEG

START: MOV AX,DATA_SEG ;传送数据段基址给段寄存器DS MOV DS,AX

MOV AX,OPER1 ;AX<--14D ADD AX,OPER2 ;AX<--14D+(-25D) JGE STORE ;若AX≥0则转STORE NEG AX ;若AX<0则对AX取补 STORE: MOV RESULT,AX ;RESULT<--AX HLT ;CPU暂停处理 CODE_SEG ENDS ;代码段结束 END START ;过程结束

29. (1)结构类型的说明:

结构名 STRUCT

?? ;数据定义语句

结构名 ENDS (2)结构变量的定义:

变量名 结构名 <字段初值表>

注:结构说明只是定义了一个框架,并未分配主存空间,必须通过结构预置语句分配主存并初始化。

(3)用结构变量,只要直接书写结构变量名;要引用其中的某个字段,则采用圆点\操作符,其格式是:结构变量名.结构字段名。

30. (1)记录类型的说明采用伪指令RECORD,它的格式为:

记录名 RECORD 位段 [,位段?]

记录名给出了说明的记录类型,位段(也称字段)表示构成记录的数据结构。 记录中位段的格式为: 位段名:位数[=表达式]

整个记录的长度为1-16位,记录长度小于8位时,汇编成1个字节;长度为9-16位时,汇编成1个字。位段从低位(右)对齐,不用的位为0。 (2)记录变量的定义格式: 记录变量名 记录名<段初值表>

(3)\记录名/记录位段名\操作符返回记录或记录位段所占的位数。

\记录位段名\操作符返回一个8位或16位数值,其中对应该位段的个位为1,其余位为0。

第四章 汇编语言程序设计 答案习题

1、此题为两个八位无符号数相减,我们可以直接使用减法指令SUB来实现。 源程序如下:

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

DSEG SEGMENT ‘DATA’ BUF DB 82,60 DSEG ENDS

CSEG SEGMENT ‘CODE’

ASSUME CS:CSEG,DS:DSEG,SS:SSEG START: MOV AX,DSEG MOV DS,AX MOV AL,BUF SUB AL,BUF+1 MOV BUF,AL MO AH,4CH INT 21H CSEG ENDS

END START

2、一般情况下,要改变一个字或一个字节中的某些位,可以利用逻辑运算操作来完成。本题应用两步来完成。第一步将x的低四清零,同时使最高位D7也清零;第二步再利用逻辑“或”变低四位为1010并同时使最高位D7为1。

MOV AL,DAT ; 取x

AND AL,70H ;清低四位和D7位

OR AL,8AH ;置低四位为1010,D7位为1 MOV DAT,AL ;送回DAT单元

3、由于两数均为压缩的 BCD码,进行的是加法操作,因此可使用DAA指令进行相加后的十进制调整。高位数与高位数相加,低位数与低位数相加。程序如下: MOV AL,BCD1 ;取BCD1低位数 ADD AL,BCD2 ;加BCD2低位数 DAA ;调整

MOV BCD3,AL ;低位相加结果送BCD3单元 MOV AL,BCD1+1 ;取BCD1高位数 ADC AL,BCD2+1 ;加BCD2高位数 DAA ;调整

MOV BCD3+1,AL ;高位数相加结果送BCD3+1单元 HLT ;结束

4、此类拆字问题一般均采用移位指令。先将DAT单元内容取出,屏蔽高四位,送入DAT+2单元。再将DAT单元内容右移四位。即:将高四位移至低四位,高四位补0,送入DAT+1单元。 程序如下: MOV AL,DAT MOV DAT+2,AL AND DAT+2,0FH MOV CL,4 SHR AL,CL MOV DAT+1,AL HLT

5、代码转换问题的解决,一般都有多种实现方法,但其中的主要操作过程是不变的。压缩的BCD码转换为ASCII码的主要操作过程为:

(1) 拆开BCD码为两个字节。 (2) 将BCD码高位移至低位 (3) 将字节高四位屏蔽(置0) (4) 分别在高、低位字节上加30H

以下程序为实现BCD码到ASCII码的转换方法之一: DATA SEGMENT

BCDBUF DB 34H,56H,23H,70H,96H,45H,32H,14H,81H,99H ;10个十进制数

COUNT EQU $-BCDBUF ASCBUF DB 20 DUP(?) ;需20个单元存放ASCII码 DATA ENDS

STACK SEGMENT PARA STACK ‘STACK’ STAPN DB 100 DUP(?) STACK ENDS COSEG SEGMENT

ASSUME CS:COSEG,DS:DATA,ES:DATA,SS:STACK START: PUSH DS MOV AX,0


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

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

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

马上注册会员

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