答:相同----都可以无条件跳转到目标地址。不同---CALL指令有返回,而JMP没有;CALL指令影响堆栈段的变化,而JMP不影响堆栈段。
2.指出子程序和宏指令的区别? 处理者 处理时间 处理方法 占用内存 运行速度 灵活性 宏 汇编程序 在汇编过程中 用宏体替换宏指令 占用内存空间多 运行速度较高 十分灵活 子程序 中央处理器 程序执行时 用CALL指令调用 占用内存空间少 运行速度较低 不够灵活 3.段内调用和段间调用的异同点是什么?
答:段内调用是指在调用和返回过程中,转返地址不涉及CS的变化,只通过IP内容的变化实现控制的转返;而段间调用需要CS,由CS和IP的变化共同决定控制的转返。
4.主程序和子程序之间有哪几类参数传递方法?
答:主程序与子程序之间的参数传递方法有三种,即堆栈法、寄存器法和存储单元。 5.子程序说明文件由哪几个部分组成?并分别说明各组成部分的含义? 答:编写子程序的目的在于减少源程序中某些相同功能程序段的重复书写,以利于自己和他人编写程序时使用。一般包含下述几项内容:
(1)子程序名称:用子程序定义伪指令定义该子程序时的名字;
(2)子程序功能:用自然语言或数学语言等形式简单清楚地描述子程序完成的任务; (3)入口参数:说明子程序要求有几个入口参数,这些参数表示的意义及存放位置; (4)出口参数:说明子程序要求有几个输出参数(运行结果),这些参数表示的意义及存放位置; (5)受影响的寄存器:说明子程序运行后,哪些寄存器的内容被破坏了,以便使用者在调用该子程序之前注意保护现场。 五、程序分析题
1.下述程序段运行后,AL=( 88H ),CL=( 80H )
MOV AL,38H MOV BL,49H CALL SUBO INC AL DEC CL ?
SUBO PROC
ADD AL,BL MOV CL,AL DAA RET
SUBO ENDP
2.宏指令GOTO L,X,REL,Y(其中REL可以是Z,NZ,L,NL等)定义如下: GOTO MACRO L,X,REL,Y
IFB
31
①展开宏调用GOTO LOP,SUM,NZ,15 MOV AX,SUM CMP AX,15 JNZ LOP
②该宏指令的功能。
②可以根据不同情况产生无条件转移指令或比较和条件转移指令。 六、填空完善程序
1.下面是计算S=X2+Y2的程序,其中平方值的计算是用直接查表法编写的SQ1子程序。设在DAX,DAY单元存放一个-9~+9的字节数据,在SQRTAB数据区中存放了0~9的平方值,将结果存入SQR单元。 .MODEL SMALL .STACK .DATA
DAX DB -7 DAY DB 4
SQRTAB DB 0,1,4,9,16,25,36,49,64,81 SQR DB ?
.CODE .STARTUP
MOV AL,DAX CALL SQ1 MOV CL,AL
( MOV AL,DAY )
CALL SQ1 ADD CL,AL
( MOV SQR,AL )
.EXIT 0 SQ1 PROC NEAR
( TEST AL,80H )
JZ K1 NEG AL
K1: LEA BX,SQRTAB
( XLAT )
RET
SQ1 ENDP
END
32
ELSE MOV CMP J&REL ENDIF ENDM
回答下列问题: ①宏展开: 1
1 1
AX,X AX,Y L
2.请根据下面子程序的说明文件填充其中的空白。子程序的说明文件如下: 子程序名称:AVER
子程序功能:求一组带符号数据的平均值
入口参数:数据的首地址在DS:SI中存放,数据个数存放在CL中 出口参数:AL=数据的平均值 AVER PROC
PUSH SI PUSH CX XOR BX,BX ( MOV CH,0 )
NEXT: LODSB
( CBW )
ADD BX,AX LOOP NEXT POP CX
( MOV AX,BX )
IDIV CL ( POP SI )
RET
AVER ENDP
七、改错题:下面是将AL中低4位的十六进制数转换为ASCII的宏定义,且允许编写程序时多次使用。程序中有错,请改正。 ALTOASC MACRO ALTOASC MACRO LOCAL ALLN1 AND AL,0FH AND AL,0AH JL ALLN1 JL ALLN1 ADD AL,7 ADD AL,7 ALLN1: ADD AL,30 ALLN1: ADD AL,30H ALTOASC END ENDM 八、编程题
1.编写一个子程序,完成自然数1~100的求和运算。 SUM PROC NEAR
PUSH AX PUSH CX MOV AX,0 MOV CX,100
AGAIN:
ADD AX,CX LOOP AGAIN POP CX POP AX
SUM ENDP
2.编写多字节加法子程序,写出子程序说明文件。
33
子程序名称:PADD
子程序功能:多字节加法
入口参数:两数据的首地址分别为DATA1和DATA2,数据个数存放在CX中 出口参数:多字节数据的和存放在首地址为SUM的内存中 受影响的寄存器:AX、BX、CX。 PADD PROC NEAR
MOV BX,0 MOV CX,LEN CLC
AGAIN:
MOV AL,DATA1[BX] ADC AL,DATA2[BX] MOV SUM[BX],AL INC BX LOOP AGAIN
PADD ENDP
3.数据区保存有10个学生的学习成绩,要求编写一个子程序,将每个学生的成绩转换成五个等级(A:90~100;B:80~89;C:70~79;D:60~69;E:60以下),然后将等级存放在原数据位置。要求:用寄存器传递参数方法来做。
COV PROC NEAR
PUSH AX PUSH BX PUSH CX MOV BX,0 MOV CX,10
AGAIN:
MOV AL,DATA[BX] CMP AL,60 JL A60 CMP AL,70 JL A70 CMP AL,80 JL A80 CMP AL,90 JL A90
MOV DATA[BX],41H JMP LOP
A90: MOV DATA[BX],42H
JMP LOP
A80: MOV DATA[BX],43H
JMP LOP
A70: MOV DATA[BX],44H
34
JMP LOP
A60: MOV DATA[BX],45H LOP: INC BX
LOOP AGAIN POP CX POP BX POP AX
COV ENDP
4.编写计算某项比赛参加者平均分的子程序。给定条件:12名评委,每名评委给分范围0~10分(整数),存放在DATAX数组中,将平均分的整数部分存入AVERAGE单元。
AVE PROC NEAR
;===SUM==== MOV CX, 12 MOV SI, 0 MOV AL, 0
AGAIN:
ADD AL,DATAX[SI] INC SI
LOOP AGAIN ;=====MAX===== MOV SI, 0 MOV BL,0 MOV CX,12
AGAIND:
CMP BL,DATAX[SI] JA NEXTD
MOV BL,DATAX[SI]
NEXTD: INC SI
LOOP AGAIND ;====MIN===== MOV SI, 0 MOV BH,0 MOV CX,12
AGAINX:
CMP BH,DATAX[SI] JB NEXTX
MOV BH,DATAX[SI]
NEXTX: INC SI
LOOP AGAINX SUB AL,BL SUB AL,BH CBW
35