第5章汇编语言层习题参考解答

更新时间:2023-05-27 08:11:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

汇编语言与计算机系统组成原理

1. 指令语句、伪指令语句和宏指令语句有何区别?

指令语句就是汇编指令,它们能汇编成机器代码,由CPU执行完成一定的操作功能。伪指令指句不由CPU执行,只为汇编程序在汇编源程序时提供有关信息。宏指令语句可看成是由若干条指令语句形成的语句,一条宏指令语句的功能相当于若干条指令语句的功能。

2. 画图说明下列伪指令语句所定义的数据在内存中的存放形式。

VAL1 BYTE ‘345’

VAL2 BYTE 3 DUP (?) VAL3 WORD 0FE56H, 2 DUP (12H) 并回答: LENGTH VAL1= ( 1 ) TYPE VAL1= ( 1 ) LENGTH VAL2= ( 3 ) TYPE VAL2= ( 1 ) LENGTH VAL3= ( 2 ) TYPE VAL3= ( 2 )。 3. 有伪指令语句如下(假设DATA_1的偏移地址为0000H): DATA_1 BYTE 2, 3, 4, ‘567’

DATA_2 BYTE 8,9,10

LT2 EQU DATA_2 – DATA_1

ORG 4

DATA_3 BYTE 0AH, 0BH, 0CH, 0DH

LT1 EQU $-DATA_1

则:LT1=( 8 )

LT2=( 6 )

DATA_2+1单元的内容=( 0DH )。

4. 说明宏是如何定义、调用和展开的。

宏定义包含3个部分:宏名、宏伪指令(MACRO与ENDM)和宏体。在进行了宏定义后,就可在源程序的任何位置上调用宏指令语句。宏展开是由宏汇编程序完成,把宏定义中宏体的程序段目标代码插入宏指令语句所在位置处;如果是带参数的宏指令语句则还要用实参替换掉宏体的对应部分。

5. 编写一个带参数的宏实现求16位通用寄存器内容的3倍积;要求:结果仍存入原寄存器,不能使用乘法指令。

定义中形参REGTEMP用作暂存器

TRIPLE MARCO REG1, REGTEMP

MOV REGTEMP, REG1

SHL REG1, 1

ADD REG1, REGTEMP

ENDM

汇编语言与计算机系统组成原理

6. 阅读下列程序,并回答问题(假设DS=00BFH):

.MODEL SMALL

.DATA

ORG 1000H

NUM BYTE 48H,8DH

RES BYTE ?

.STACK 100

.CODE

START: MOV AX, @DATA

MOV DS,AX

MOV SP, 64H

LEA BX, NUM

MOV AL, [BX]

SUB AL, [BX+1]

PUSH AX

PUSHF

ADD AL,AL

POPF

POP AX

MOV [BX+2],AL

MOV AH,4CH

INT 21H

END START

问题:

(1) 分析程序运行后,存储器中数据段中数据存放情况,填入具体数据;

(2) 分析最后标志位OF、SF、ZF、AF、PF和CF的状态(其它各位假定为0);

(3) 分析堆栈进栈情况,进栈后,SP是多少? 堆栈中填入具体数据。

OF、SF、CF、AF、PF均为1,ZF=0;SP=62H

7. 编程实现利用查表法求73的平方,假设从SQTAB为首地址的内存中放有0~100的平方值,结果送入RES字单元中。

.MODEL SMALL

.DATA

SQTAB WORD 0,1,4,9, …,10000

RES WORD ?

.STACK 64H

.CODE

START: MOV AX, @DATA

MOV DS,AX

汇编语言与计算机系统组成原理

MOV BX, OFFSET SQTAB

MOV SI, 146

MOV AX, [BX+SI]

MOV RES, AX

MOV AH,4CH

INT 21H

END START

8. 是否多分支结构程序都可通过双分支结构来实现? 试举例说明在什么条件下用地址表法或转移表法实现多分支转移能有较高的运行效率。

是。如果问题中的多个分支可以用连续的编号进行划分(指编号不需额外计算的情形),用地址表法或转移表法实现多分支转移能有较高的运行效率。参考例题5-28。

9. 阅读程序:

.MODEL SMALL

.DATA

AA DB 0A7H, 89H, 23H, 8EH

BB DB 0B0H, 87H, 94H, 62H

CC DB 5 DUP(?)

COUNT EQU 0004H

.CODE

START: MOV AX, @DATA

MOV DS, AX

MOV ES, AX

CLD

LEA DI, AA

LEA SI, BB

AND AX, AX

MOV BX, OFFSET CC+4

MOV CX, COUNT

MUL1: MOV AL, [DI+3]

ADC AL, [SI+3]

MOV [BX], AL

DEC DI

DEC SI

DEC BX

DEC CX

JNZ MUL1

MOV AL, 0

RCL AL, 1

MOV [BX], AL

MOV AH, 4CH

INT 21H

END START

汇编语言与计算机系统组成原理

回答下列问题:

(1) 该程序实现什么操作?

(2) 程序执行后,CC+3单元的内容是什么?

(3) 程序执行后,BX所指单元的内容是什么?

(4) 程序中,指令AND AX, AX的作用是什么? 能用其它指令替代吗?

(5) 程序中,指令MOV AL, 0能用XOR AL, AL替代吗? 为什么?

(1) AA与BB两个4字节数求和

(2) 0B7H

(3) 1

(4) 设置CF=0。可用CLC替代。

(5) 不能。逻辑运算会将CF清零。

10. 写一个宏,判断从键盘输入的一个字符是否为大写字母;若是就转换为小写字母,否则不转换。

CAPLETT MACRO REG

MOV AH, 08H

INT 21H

CMP AL, 41H

JB EXIT

CMP AL, 5AH

JA EXIT

ADD AL, 20H

EXIT: MOV REG, AL

ENDM

11. 学生成绩存放在SCORE单元(60~100分),试用地址表法或转移表法实现:100分,屏幕显示“A+”,90~99分显示“A”,80~89分显示“A-”,70~79分显示“B+”,60~69分显示“B”。

.MODEL SMALL

.DATA

SCORE BYTE 60

AP BYTE 'A+','$'

A BYTE 'A','$'

AM BYTE 'A-','$'

BPL BYTE 'B+','$'

B BYTE 'B','$'

J_TAB WORD L1,L2,L3,L4,L5

.CODE

START: MOV AX, @DATA

MOV DS, AX

XOR AH,AH

MOV AL,SCORE

SUB AL,60

MOV BL,10

汇编语言与计算机系统组成原理

DIV BL

MOV BL,AL

XOR BH,BH

SHL BX,1

JMP J_TAB[BX]

L1: MOV DX,OFFSET B

MOV AH,9

INT 21H

JMP NEXT

L2: MOV DX,OFFSET BPL

MOV AH,9

INT 21H

JMP NEXT

L3: MOV DX,OFFSET AM

MOV AH,9

INT 21H

JMP NEXT

L4: MOV DX,OFFSET A

MOV AH,9

INT 21H

JMP NEXT

L5: MOV DX,OFFSET AP

MOV AH,9

INT 21H

JMP NEXT

NEXT: MOV AH, 4CH

INT 21H

END START

12. 循环程序由几部分构成?各部分的功能是什么?

初始化部分:设置循环的初始值,如设置地址指针、循环计数器、累加器和标志位的初值等。

工作部分:通常也叫作循环体。 它是循环程序核心部分,动态地执行功能相同的操作。 修改部分:与工作部分协调配合,完成对地址指针及控制量的修改,为下次循环或退出做好准备。 通常每执行循环体一次,都要作相应的修改。

控制部分:判断并控制结束还是继续循环。

结束处理部分:对循环结果的操作,比如对运算结果的存储与传输等。

13. 常用的循环程序的控制方法有哪几种?分别适用于什么场合?

控制循环结束与否主要有两类方法:用计数器控制循环和用条件控制循环。

如果循环次数已知,就可以利用循环次数来控制循环结束与否。当实际的循环次数未知或不确定时,用某些条件(即根据某些标志位)来控制循环结束与否。

汇编语言与计算机系统组成原理

14. 阅读程序

DATA SEGMENT

NUM WORD 8096H

RES BYTE ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA

START: MOV AX, DATA

MOV DS, AX

MOV CX, 16

MOV AX, NUM

LOP1: AND AX, AX

JZ DONE

SHL AX, 1

JNC NEXT

INC CH

NEXT: DEC CL

JNZ LOP1

DONE: MOV RES, CH

MOV AH, 4CH

INT 21H

CODE ENDS

END START

回答下列问题:

(1) 该程序的功能是什么?

(2) 程序运行结束时,RES单元的内容是什么?

(3) 指令AND AX, AX程序中的作用是什么?

(1) 统计NUM单元字数据中1的位数

(2) 5

(3) 判断AX是否为零,判断是否提前结束循环(统计AX中1的位数)。

15. 100个学生某科考试成绩(0~100分)存放在以RECORD为首的内存单元中,统计0~59分、60~69分、70~79分、80~89分、90~99分、100分的人数;并计算全班的平均成绩,保留整数位,结果四舍五入。

.MODEL SMALL

.DATA

SCORE BYTE 0,45,50,60,…100

MEAN BYTE ?

S100 BYTE 0

S90 BYTE 0

S80 BYTE 0

S70 BYTE 0

S60 BYTE 0

S59 BYTE 0

汇编语言与计算机系统组成原理

.STACK 100H

.CODE

START: MOV AX, @DATA

MOV DS,AX

MOV CX, 100

LEA SI, SCORE

XOR AX, AX

XOR BH, BH

LOP: MOV BL, [SI]

CMP BL, 100

JB N90

INC S100

JMP NEXT

N90: CMP BL, 90

JB N80

INC S90

JMP NEXT

N80: CMP BL, 80

JB N70

INC S80

JMP NEXT

N70: CMP BL, 70

JB N60

INC S70

JMP NEXT

N60: CMP BL, 60

JB N59

INC S60

JMP NEXT

N59: INC S59

NEXT: ADD AX,BX

INC SI

LOOP LOP

MOV CX, 100

XOR DX, DX

DIV CX

SHL DX, 1

CMP DX, 100

JB NXT2

INC AX

NXT2: MOV MEAN, AL

MOV AH, 4CH

INT 21H

END START

汇编语言与计算机系统组成原理

16. 假设6位由字母或数字构成的密码(ASCII码)存储在以PWRD为首地址的内存单元中。 编程实现:首先显示“Please enter the password:”, 然后等待键盘输入字符串,若与存储的密码相符,显示欢迎信息“Welcome !”;否则,再次提示输入,总共有三次输入机会,每次输入错误后,显示出错信息“Wrong password, ?? tries left.”, ??用具体数字替代。 三次都输入错误,显示“ACCESS DENIED!”并结束程序。

DISP MACRO STR

MOV AH, 9

MOV DX, OFFSET STR

INT 21H

ENDM

DATA SEGMENT

PWRD BYTE '123A56'

IN_BUF BYTE 7,?

INWD BYTE 7 DUP(?)

CR EQU 0DH

LF EQU 0AH

ST1 BYTE 'Please enter the password:',CR,LF,'$'

ST2 BYTE 'Welcome !',CR,LF,'$'

ST3 BYTE 'Wrong password, '

CONT BYTE ?

BYTE ' tries left.',CR,LF,'$'

ST4 BYTE 'ACCESS DENIED!',CR,LF,'$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, ES:DATA

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV BL,3

CLD

DISP ST1

AGAIN: MOV AH,0AH

MOV DX, OFFSET IN_BUF

INT 21H

MOV SI, OFFSET PWRD

MOV DI, OFFSET INWD

MOV CX,6

REPE CMPSB

JNZ NEXT

DISP ST2

JMP EXIT

NEXT: DEC BL

汇编语言与计算机系统组成原理

JNZ NEXT2

DISP ST4

JMP EXIT

NEXT2: OR BL,30H

MOV CONT,BL

DISP ST3

AND BL,0FH

JMP AGAIN

EXIT: MOV AH,4CH

INT 21H

CODE ENDS

END START

17. 字节数组DATA1中,存放有10个不等的符号数,编程实现求最大值、最小值,以及两者存放单元的偏移地址。

.MODEL SMALL

.DATA

DATA1 BYTE -1,2,4,5,-77,8,9,10,-11,-10

MAX BYTE ?

MAXADD WORD ?

MIN BYTE ?

MINADD WORD ?

.CODE

START: MOV AX,@DATA

MOV DS,AX

LEA BX, DATA1

MOV CX,9

MOV SI,BX

MOV DI,BX

MOV AL,DATA1

MOV AH,DATA1

INC BX

LOP: MOV DL,[BX]

CMP AL,DL

JLE NEXT1

MOV AL,DL

MOV SI,BX

JMP NEXT2

NEXT1: CMP AH,DL

JGE NEXT2

MOV AH,DL

MOV DI,BX

NEXT2: INC BX

LOOP LOP

汇编语言与计算机系统组成原理

MOV MAX, AH

MOV MAXADD, DI

MOV MIN, AL

MOV MINADD, SI

MOV AH,4CH

INT 21H

END START

18. 调用程序与子程序间传递参数有几种常用方式?各有何特点?

参数传递方式主要有三种:通过寄存器传递、通过堆栈传递和通过内存单元传递。用寄存器传递参数方便、执行速度快,但由于寄存器个数有限,只适用于参数较少的情况。使用堆栈或内存单元传递参数时,由于需要访存,执行速度比不上寄存器传递参数的方式,但便于处理多个参数的情形。

19. 试比较子程序与宏指令。

子程序与宏指令的共同点:都可简化程序设计,增强程序的可读性。

子程序与宏指令的不同点:使用子程序编程可减小目标代码的体积,从而节省内存存储空间(存储程序的空间,不包括运行运行子程序所占用的堆栈空间),而且子程序的调用是由CPU在运行程序时完成;宏指令不能减小目标代码的体积和节省内存存储空间,宏指令是在汇编时完成展开的。

20. 阅读程序,回答问题:

(1) 该子程序功能是什么?

(2) 子程序的入口参数、出口参数分别是什么?

SUB2 PROC NEAR/FAR

PUSH CX

PUSH AX

MOV CX, 16

BIN1: ROL BX, 1

MOV AL, BL

AND AL, 1

ADD AL, 30H

CALL SUBOUT ;调用显示子程,入口参数AL

LOOP BIN1

POP AX

POP CX

RET

SUB2 ENDP

(1) 将BX的各位在显示器上输出。

(2) 入口参数为BX,出口参数为显示器上的输出。

21. 编写子程序实现两个多字节压缩BCD码相减。

; 子程序名:MBINSUB

; 功能:将两个多字节压缩BCD码相减

汇编语言与计算机系统组成原理

; 入口参数:SI,DI分别指向被减数、减数的首地址,BX指向差的首地址,

; CX中存放多字节的长度

; 出口参数:BX指向差的首地址

MBINSUB PROC NEAR/FAR

PUSH AX

PUSH BX

CLC

LP: MOV AL,[SI]

SBB AL,[DI]

DAS

MOV [BX],AL

INC SI

INC DI

INC BX

LOOP LP

POP BX

POP AX

RET

MBINSUB ENDP

22. 编写子程序实现把键盘输入任意组合的8位0、1字符转换为等值的二进制数,送数据段BIN1字节单元。

; 子程序名:ASC8BIN

; 入口参数:DX指向输入缓冲区的首地址(使用0AH号DOS功能接受键盘输入字符串), ; 出口参数:BIN1

ASC8BIN PROC NEAR/FAR

PUSH AX

PUSH BX

PUSH CX

MOV BX, DX

ADD BX, 2

MOV CX, 8

MOV AH,0AH

INT 21H

XOR AH,AH

LOP: MOV AL, [BX]

AND AL,1

ADD AH,AL

SHL AH,1

INC BX

LOOP LOP

MOV BIN1, AH

POP CX

POP BX

汇编语言与计算机系统组成原理

POP AX

RET

ASC8BIN ENDP

23. 编写递归子程序,计算an的值。

为简化问题,仅讨论a,n(n>0)为字节操作数,an为字操作数的情况。

; 子程序名:POWER

; 入口参数:AX存放a,CL存放n

; 出口参数:AX存放an

POWER PROC NEAR/FAR

DEC CL

JNZ NEXT

RET

NEXT: PUSH BX

MOV BX, AX

CALL POWER

MUL BX

POP BX

RET

POWER ENDP

24. 试用递归子程序解决"梵塔"问题(The Towers of Hanoi):

1).有三根杆子A, B, C. A杆上有若干大小不等的碟子, 小的叠在大的上面;

2).每次移动一块碟子,小的只能叠在大的上面;

3).把所有碟子从A杆全部移到C杆上。

为简化问题,仅讨论4个碟子的情形

; 子程序名:HANOI

; 入口参数:CL存放碟子数,BL存放源杆号,BH存放目标杆号

DISP MACRO STR

MOV AH, 9

`MOV DX, OFFSET STR

INT 21H

ENDM

.MODEL SMALL

.DATA

CR EQU 0DH

LF EQU 0AH

STEP BYTE 'Move a disk from '

NUM1 BYTE ?

BYTE ' to '

NUM2 BYTE ?

BYTE CR,LF,'$'

汇编语言与计算机系统组成原理

.STACK 500H

.CODE

START: MOV AX,@DATA

MOV DS,AX

MOV CL,4

MOV BL,31H

MOV BH,33H

CALL HANOI

MOV AH,4CH

INT 21H

HANOI PROC

DEC CL

JNZ NEXT

MOV NUM1, BL

MOV NUM2, BH

DISP STEP

RET

NEXT: MOV CH,96H

SUB CH,BL

SUB CH,BH

PUSH CX

XCHG CH,BH

CALL HANOI

XCHG CH,BH

MOV CL,1

CALL HANOI

POP CX

XCHG CH,BL

CALL HANOI

XCHG CH,BL

RET

HANOI ENDP

END START

25. 下列数据段中定义了0AH号DOS功能调用的键盘输入数据缓冲区BUF,(a)和(b)的值相同吗?假设要完全接收长度为5的字符串(不包括结束的回车符),(a)和(b)的值至小分别为多大?此时缓冲区共有多少个字节?且完成键盘输入后,缓冲区第二个字节的值是多少? DATA SEGMENT

BUF DATA ENDS

(a)和(b)的值相同。

(a)和(b)的值至小为6, 缓冲区共有8个字节, 完成键盘输入后,缓冲区第二个字节为5。

本文来源:https://www.bwwdw.com/article/xzb4.html

Top