微机原理习题与实验-F 下载本文

程序的多个地方或多个程序中都用到相同功能的程序段,这时常采用子程序设计方法。

4.2 习题解答

1. 什么叫汇编?汇编语言源程序的处理过程是什么?

解:任何CPU都只能执行机器语言程序。汇编语言不是机器语言,汇编语言程序必须通过具有“翻译”功能的系统程序的处理,处理的过程称为汇编。

汇编语言源程序经过汇编生成机器语言目标程序,简称目标程序。目标程序经过连接程序连接,就得到可执行的机器语言程序文件。

2. 汇编语言的语句类型有哪些?各有什么特点?

解:汇编语言的语句类型有两种:指示性语句和指令性语句。指示性语句可以位于任何段中,指令性语句必须位于代码段内。

? 指示性语句

又称为伪操作语句,它不是8088/8086CPU的指令,它与汇编程序(assembler)有关。指示性语句的功能主要是变量定义、为数据分配存储空间、告诉汇编程序如何对源程序汇编等。源程序汇编后指示性语句不生成目标代码,所以常被称为伪指令。

? 指令性语句

指令性语句是可执行语句,是8088/8086CPU的指令。源程序汇编后指令性语句生成目标代码。第3章中介绍的所有指令都是指令性语句的主体,其操作数最多只能有两个。

3. 汇编语言源程序的基本结构是什么?

解:汇编语言源程序由若干段组成:数据段、附件数据段、堆栈段和代码段等,段与段之间的顺序可以随意排列,每一段由SEGMENT开始,以ENDS结束,每段的开始和结束都附有相同的名字。一个程序一般定义三个段:数据段、堆栈段和代码段,必要时增加定义附加数据段,能独立运行的程序至少包含一个代码段。

4. 写出完成下述要求的变量定义的语句:

(1) 为缓冲区BUFF保留200个字节的内存空间 (2) 将字符串’BYTE’,’WORD’存放于某数据区

(3) 在数据区中存入下列5个数据:2040H,0300H,10H,0020H,1048H

解:

(1)为缓冲区BUFF保留200个字节的内存空间

BUFF DB 200DUP(?)

(2)将字符串’BYTE’,’WORD’存放于某数据区

DB ‘BYTE’,’WORD’

(3)在数据区中存入下列5个数据:2040H,0300H,10H,0020H,1048H

DW 2040H,0300H,10H,0020H,1048H

5. 画出下面数据段汇编后的内存图,并标出变量的位置。

DATA SEGMENT AA EQU 78H

AA0 DB 09H,-2,45H,2 DUP(01H, ?),’AB’ AA1 DW -2,34H+AA AA2 DD 12H DATA ENDS

解:如图4-1所示。

6. 设程序中的数据定义如下:

NAME DB 30 DUP(?) LIST DB 1,7,8,3,2

ADDR DW 30 DUP(?)

(1) 取NAME的偏移地址放入SI (2) 取LIST的前两个字节存入AX (3) 取LIST实际长度

解:(1)取NAME的偏移地址放入SI

MOV SI,OFFSET NAME

(2)取LIST的前两个字节存入AX

MOV AX,WORD PTR [LIST]

(3)取LIST实际长度

MOV AX,SIZE LIST

AA009HFEH45H01H?01H?41H42HAA1FEHFFHACH00HAA012H00H00H00H图4-1

7. 依据下列指示性语句,求表达式的值。 SHOW0 EQU 200 SHOW1 EQU 15 SHOW2 EQU 2 ⑴ SHOW0X100+55 ⑵ SHOW0 AND SHOW1-15 ⑶ (SHOW0/SHOW2)MODSHOW1 ⑷ SHOW1OR SHOW0 解:(1)SHOW0X100+55=200X100+55

⑵ SHOW0 AND SHOW1-15=C8AND0F-0F=-7

⑶ (SHOW0/SHOW2)MODSHOW1=100MOD15=10 ⑷ SHOW1OR SHOW0=0FORC8=CF

8. 编写程序,统计寄存器BX中二进制位“1”的个数,结果存在AL中。

DATA SEGMENT NUM X DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA

MOV DS,AX

MOV AL,0

MOV BX,NUM ;把数X传送给BX MOV CX,16

NEXT: SHL AX,1

JNC NEXT1 INC AL

NEXT1: LOOP NEXT

MOV AH,4CH

INT 21H

CODE ENDS

END START

9. 某数据块存放在BUFFER开始的100个字节单元中,试编写程序统计数据块

中正数(不包括0)的个数,并将统计的结果存放到NUMBER单元中。

解:DATA SEGMENT

BUFFER DB 100(?) DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA

MOV DS,AX XOR DX, DX

MOV CX,100 MOV SI,OFFSET BUFFER NEXT: MOV AL,[SI] INC SI TEST AL,80H ;是正数吗? JNZ GOON ;否,转移到GOON CMP AL,0 JZ GOON

INC DX

GOON: LOOP NEXT MOV NUMBER,DX

MOV AH,4CH INT 21H

CODE ENDS

END START

10. 阅读下面程序段,指出它的功能。 DATA SEGMENT

ASCII DB 30H, 31H, 32H, 33H ,34H ,35H, 36H, 37H, 38H, 39H HEX DB 04H DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA

解:这是一个查表程序,查表取出HEX中的ASCII。

11. 某数据区中有100个小写字母,编程把它们转换成大写字母,并在屏幕上显示。

解:DATA SEGMENT

BUFFER DB 100(?) DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA

MOV DS,AX

MOV CX,100 MOV SI,OFFSET BUFFER NEXT: MOV AL,[SI] INC SI CMP AL,61H ;是小写字母吗? JB GOON ;否,转移到GOON SUB AL,20H MOV DL,AL MOV AH,2 INT 21H

GOON: LOOP NEXT MOV AH,4CH

INT 21H

CODE ENDS END START

12. 子程序的参数传递有哪些方法?

解:

主程序在调用子程序时,要为子程序预置数据,在子程序返回时给出数据处理的结果,这称为数据传送或变量传送。方法主要有以下几种:

START: MOV AX, DATA

MOV DS, AX

MOV BX,OFFSET ASCII MOV AL,HEX AND AL,0FH ADD BX,AL MOV AL,[BX] MOV DL,AL MOV AH,2 INT 21H

MOV AH,4CH INT 21H

CODE ENDS END START