《微机原理与接口技术》参考答案(4)

2019-01-05 12:49

JE EXIT

CMP BYTE PTR [BX],20H JNE NEXT DELETE: PUSH BX

MOV DL,[BX+1] MOV [BX],DL INC BX

CMP [BX+1],0 JZ NEXT JMP DELETE NEXT: POP BX INC BX JMP AGAIN EXIT: MOV SI,0

CMP BYTE PTR [SI],20H JE CYCLE LEA BX,STR COMPARE:

CMP BYTE PTR [BX],20H JE PRINT INC BX

JMP COMPARE PRINT:

MOV [BX],'$' LEA DX,STR MOV AH,09H INT 21H

MOV AH,07H INT 21H

MOV AX,4C00H INT 21H CODE ENDS END START

16.假设从变量Buff开始存放了200个字,编写一个程序统计出其正数、0和负数的个数,并把它们分别存入N1、N2和N3中。 答:DATA SEGMENT SAVE DB 3 DUP(?) · ·16

NUM DW 100 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,100 XOR BX,BX XOR DX,DX LEA SI,NUM SUB SI,2 NEXT1:ADD SI,2 CMP [SI],0 JNZ NZ

INC BL ;存放零的个数 JMP OK

NZ: TEST [SI],8000H JNZ N

INC DH ;存放正数的个数 JMP OK

N: INC DL ;存放负数的个数 OK: LOOP NEXT1

MOV SAVE,DH ;将结果传送到内存保存 MOV SAVE+1,DL MOV SAVE+2,BL MOV AH,4CH INT 21H CODE ENDS

END START

17.用双重循环将下三角乘法表存入从Result开始的45字节中。

18.简述在子程序结构中堆栈的作用。

答:子程序在调用和返回时,使用堆栈来保存断点和恢复断点。对于段内调用,CALL指令调用子程序时首先保存断点使IP入栈,然后转子程序。RET指令返回时要使IP出栈恢复断点。对于段间调用,保存断点时要使CS和IP分别入栈,恢复断点时使IP和CS出栈。 19.如何区分RET指令是段内返回还是段间返回?

答:汇编程序在处理子程序时,根据PROC后的子程序类型的说明来确定子程序的类型属性,也确定了是将RET助记符翻译为段内返回还是段间返回。

20.在子程序中如果要使其所用寄存器对调用者是透明的,请举例说明达到其目的的方法。 答:在子程序中如果要使其所用的寄存器对调用者是透明的,就是要注意寄存器的保存和恢

·17·

复,以便当返回调用程序后仍然保持正确的状态继续执行。例如,在子程序开始时,把它要用到的所有寄存器都入栈保存,在返回前再出栈恢复。

21.子程序参数传递主要有哪些方法?它们各有什么优缺点?

答:主要有三种方法:1)通过寄存器传递;2)通过存储器传递;3)通过堆栈传递。通过寄存器传递参数速度快,但参数个数受寄存器数量的限制,适用于参数很少的情况。通过存储器传递参数,可以相互传送较多的参数。通过寄存器和存储器传递参数都具有全局性质,而通过堆栈传递的参数确是局部性的,它们的生命周期随着子程序结束后堆栈的复原而结束,这样在子程序中对参数进行修改对调用者没有任何影响。 22.分别编写子程序实现下列功能(所有变量都是字类型)。

(1)ABS(x)=|x|

(2)F(x)=3x2 + 5x - 8 (3)strlen(String),(求字符串长度,字符串以0结束)

23.给定一个正数n≥1存放在NUM字变量,试编写递归子程序计算FIB(n),结果保存到RESULT变量中。

Fibonacci数定义如下:

答:STACK SEGMENT STACK 'STACK' DW 32 DUP(0) STACK ENDS DATA SEGMENT A DB 8 DUP(0) OBF DB 3,0,3 DUP(0) DATA ENDS

CODE SEGMENT BEGIN PROC FAR

ASSUME SS:STACK,CS:CODE,DS:DATA PUSH DS SUB AX,AX PUSH AX

MOV AX,DATA MOV DS,AX

MOV DX,OFFSET OBF MOV AH,10 INT 21H

MOV AL,OBF+1 · ·18

CMP AL,1 JA NEX2

MOV CL,OBF+2 AND CL,0FH JMP NEX1

NEX2: MOV AL,OBF+2 AND AL,0FH MOV CL,10 MUL CL

MOV AH,OBF+3 AND AH,0FH ADD AL,AH MOV CL,AL

NEX1: MOV CH,0 CMP CX,3 JB ONE SUB CX,2

MOV AX,1 MOV BX,1 AGAIN: MOV DX,AX ADD AX,BX MOV BX,DX LOOP AGAIN

MOV BX,7 MOV A[BX],'$' MOV CX,10 AG: MOV DX,0 DIV CX OR DL,30H DEC BX

MOV A[BX],DL AND AX,AX JNZ AG SUB BX,2

MOV WORD PTR A[BX],0A0DH MOV DX,BX

ADD DX,OFFSET A

19··

MOV AH,9 INT 21H JMP LAST

ONE: MOV DL,0AH MOV AH,2 INT 21H

MOV DL,31H MOV AH,2 INT 21H

LAST: RET

BEGIN ENDP CODE ENDS END BEGIN

24.C语言是如何实现可变参数的函数的?举例说明。

答:C语言的参数传递使用的是堆栈传递方法,而且C语言的参数入栈次序是从右往左的,这样不同于Pascal等语言从参数表按自左至右的次序入栈。由于堆栈后入先出的特点,自左至右的次序入栈就决定了出栈的第一个参数就是最后一个参数,也就不可能支持可变参数了。而C语言参数自右往左入栈,那么出栈的第一个参数就是函数的第一个参数,到参数全部出栈后才能确定所有函数参数,因此实现了可变参数的函数。

25.请说明宏和子程序的主要区别有哪些。一般在什么情况下选用宏较好,在什么情况下选用子程序较好?

答:宏和子程序的区别在于:子程序是CALL和RET指令的执行结果,是在程序执行过程中处理的,一般来说,子程序的多次调用比不用子程序要节省代码;而宏是在汇编过程中进行宏展开的效果,并不节省代码。宏可以用来实现对指令、系统调用或子程序调用等进行功能扩充,便于应用于模块功能实现的情况;对于多次引用的相同程序段可以独立的编成子程序,当需要执行这个程序段时,可以使用调用指令调用它。

26.在宏调用时,是否要求实参与形参的个数相等?若不要求,当个数不一致时会出现什么情况?

答:不要求实参的个数与形参的个数相等。当实参的个数多于形参的个数时,多出的实参被忽略;当实参的个数少于形参的个数时,没有实参对应的形参则用“空”来对应。 27.宏应如何正确使用标号?

答:宏定义中的标号需要使用伪指令LOCAL来说明标号是局部标号,这样汇编程序在每次进行宏展开时,总是把由LOCAL说明的标号用一个唯一的标号代替,从而可以避免标号重复定义的错误。

28.定义宏指令FINSUM:比较两个数X和Y,若X>Y,则执行SUM=X + 2 * Y,否则,执行SUM=2 * X + Y。 · ·20

29.使用条件汇编的目的是什么?

答:宏定义中的标号需要使用伪指令LOCAL来说明标号是局部标号,这样汇编程序在每次进行宏展开时,总是把由LOCAL说明的标号用一个唯一的标号代替,从而可以避免标号重复定义的错误。

30.编写只有一个形式参数的宏PRINT,其具体功能如下:

(1)若引用时带有参数,则在屏幕上显示其参数字符,例如,若PRINT'A',则显

示字符A;

(2)若引用时不带实参,则显示回车和换行,例如,PRINT。

31.一个学生的信息包括姓名、班级、学号、成绩,其中成绩需要精确到1位小数。试编写程序实现以下功能:

(1)可以录入学生成绩(十进制形式);

(2)可以按要求(如学号或成绩)进行排序显示; (3)可以统计平均成绩;

(4)可以统计不及格、60~70、70~80、80~90、90~100各分数段的人数。 提示:应该以上往下规划程序结构,划分各个子程序的功能和调用关系。

·21·


《微机原理与接口技术》参考答案(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:最新-2018电大学前教育专业(专科)《学前游戏理论与指导》试题考

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

马上注册会员

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