汇编语言程序设计教程(第二版)卜艳萍著(5)

2018-12-05 20:56

般应该包含如下几个方面:

? ? ? ?

子程序名。

功能:用尽量简明的文字描述子程序的功能。 入口参数:调用子程序前的准备工作。

出口参数:从子程序返回后可获得的结果。

5. 简述指令CALL和转移指令JMP之间的主要区别。

执行CALL指令时,首先把子程序的返回地址(CALL指令后面一条指令的地址,称为断点地址,即当前指令指针寄存器IP的内容)入栈保护,以便当返回主程序时,从下一条指令继续往下执行,然后把主程序的入口地址送入IP,无条件地转移到OPRD所指的目标地址去执行子程序。子程序执行结束后,断点地址从堆栈中弹回IP中,从而使程序返回到CALL语句的下一条语句继续执行程序。

JMP指令是无条件转移指令,无需保护断点,也不返回断点的功能,只是简单的转移。

6. 简述子程序嵌套与递归的区别。

一个子程序可以作为调用程序去调用另一个子程序,这种情况就称为子程序的嵌套。嵌套的层次不限,其层数称为嵌套深度。嵌套子程序的设计并没有什么特殊要求,除子程序的调用和返回应正确使用CALL和RET指令外,要注意寄存器的保存和恢复,以避免各层子程序之间发生因使用寄存器冲突而出错的情况。

在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这就称为递归调用。这样的子程序称为递归子程序。在子程序递归调用时,也不可避免地要用到堆栈,所以递归调用的嵌套层数往往会受堆栈容量的限制。

7. 在内存BUFFER单元中定义有10个16位数,试寻找其中的最大值及最小值,并放至

指定的存储单元MAX和MIN中。画出程序流程图。

STACK SEGMENT STACK DW 256 DUP(?)

STACK ENDS DATA SEGMENT

BUFFER DW 56H,29H,10H,22H,09H,8FH,1AH,6DH,3DH,33H MAX DW ? MIN DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA START:MOV AX,DATA

MOV DS,AX

MOV BX,OFFSET BUFFER

MOV CX,10 DEC CX

MOV AX,[BX]

INC BX

LOP1:CMP AX,[BX]

JG BIG

21

MOV AX,[BX] BIG:INC BX

LOOP LOP1

MOV MAX,AX

JMP EXIT

MOV BX,OFFSET BUFFER MOV CX,10 DEC CX

MOV AX,[BX]

INC BX

LOP2:CMP AX,[BX] JL SMALL

MOV AX,[BX]

SMALL:INC BX

LOOP LOP2 MOV MIN,AX

EXIT:MOV AH,4CH INT 21H CODE ENDS END START

8. 统计字型变量DATBUF中的值有多少位为0,多少位为1,并分别记入COUNT0及

COUNT1单元中。

在内存单元定义一个变量DATBUF,将其取到寄存器中,采用移位的方式识别每一位为0还是为1,设置两个计数器分别统计。统计好后,分别存入内存单元。

9. 试编写能实现如下功能的过程。 (1)十进制数转换为ASCII码 SUB1 PROC FAR

PUSH AX

MOV AL,BUF1 AND AL,0FH

OR AL,30H MOV BUF2,AL POP AX RET

SUB1 ENDP

(2)十六进制数转换为ASCII码 SUB1 PROC FAR PUSH AX

MOV AL,BUF1

AND AL,0FH OR AL,30H CMP AL,39H

22

JLE EXIT ADD AL,7H

EXIT:MOV BUF2,AL

POP AX RET

SUB1 ENDP

(3)数字0~9的ASCII码转换为非压缩的BCD码 SUB1 PROC FAR

PUSH AX

MOV AL,BUF1

AND AL,0FH MOV BUF2,AL POP AX RET

SUB1 ENDP

(4)将四位二进制数中的每一位按顺序转换为BCD码SUB1 PROC FAR

PUSH AX PUSH BX

PUSH CX

MOV AL,BUF1

MOV BX,OFFSET BUF2 MOV CL,4 SHL AL,CL

AGAIN:SHL AL,1

JC C1

MOV [BX],30H

JMP NEXT

C1:MOV [BX],31H NEXT:INC BX

DEC CL JNZ AGAIN POP CX POP BX POP AX RET

SUB1 ENDP

(5)数字的ASCII码转换为十六进制数 SUB1 PROC FAR

PUSH AX

MOV AL,BUF1 CMP AL,39H JLE NEXT SUB AL,7H

23

NEXT:AND AL,0FH

MOV BUF2,AL

POP AX RET

SUB1 ENDP

2

(6)f(x)= 2x+3x–4 (结果限定在16位范围内) SUB1 PROC FAR

PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,0

MOV AL,X MOV BL,AL MUL BL MOV DL,2 MUL DL

ADD CX,AX MOV AL,BL MOV DL,3

MUL DL

ADD CX,AX SUB CX,4 MOV FX,CX POP DX POP CX POP BX

POP AX RET

SUB1 ENDP

10. 设在变量单元A1、A2、A3、A4中存放有4个数,试编程实现将最大数保留,其余三

个数清零的功能。

依次比较各个数,每次比较中将较小的数清零,较大数及较大数的地址保留,再继续与下一个数比较,直至四个数处理完。

11. 在BUFF开始的存储区中存放30个带符号数,试统计其正数、负数和零的个数。并将

个数分别放至A1、A2及A3单元。

将30个符号数依次取到寄存器中,判断每个数的符号位,依此可识别出负数和非负数,再判断是否为0,可识别出是零还是正数。设置3个计数器分别统计正数、负数和零的个数,统计完后存入内存单元。

12. 若在内存缓冲区中存在一个无序列,列的长度放在缓冲区的第一个字节,试将内存某单

元中的一个数加入到此数列中(若此数列中有此数,则不加;若此数列中无此数,则加在数列尾)。

24

? 将内存定义好的数串依次取到寄存器中,与要加入的数据比较; ? 如无此数,取下一个数继续比较;

? 如有此数,则停止比较,将该数加到数尾,并且列的长度加1;

13. 在内存已定义好一个容量为20字节的数组,请将数组中为0的项找出,统计0的个数,

并删除数组中所有为零的项,将后续项向前压缩。

? 将数组依次取到寄存器中,每个数与零比较;

? 统计0的个数;

? 每次发现为0的项,统计后将其删掉,后续项向前移。

14. 将内存字单元BUF1中的内容拆为四个16进制数,并分别转换为相应的ASCII码存于

BUF2及其后续的单元中。 STACK SEGMENT STACK DW 256 DUP(?) STACK ENDS DATA SEGMENT

BUF1 DW 37D5H

BUF2 DB 4 DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA START:MOV MOV

MOV MOV

AX,DATA DS,AX

BX,OFFSET BUF1 DI,OFFSET BUF2

MOV AX,[BX] MOV BX,AX

MOV DX,4 MOV CL,4

LOP:AND AX,000FH

OR AL,30H CMP AL,39H JLE STORE ADD AL,7

STORE:MOV [DI],AL

SHR BX,CL

MOV AX,BX DEC DX JNZ LOP

MOV AH,4CH

INT 21H CODE ENDS

END START

25


汇编语言程序设计教程(第二版)卜艳萍著(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:微观经济学考试试题及参考答案

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

马上注册会员

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