XCHG AL,[DI] MOV [SI],AL ADD SI,2 ADD DI,2
LOOP LOP
上述程序段运行后,S9开始的10个字节存储单元内容是什么? 答:S9 DB 1,0,3,2,5,4,7,6,9,8
三、用循环结构完成下列程序:(15分)
向存储器的十个连续单元写入1,2,3,4,5,6,7,8,9,10个数字。 参考答案:
DATA SEGMANT
BUFFER DB 10 DUP(?)
VAR1 DB 1,2,3,4,5,6,7,8,9,10 COUNT DB 10 DATA ENDS
CODE SEGMANT
ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX LEA DI, BUFFER
LEA SI, VAR1 MOV CH, 0
MOV CL, COUNT AGAIN:MOV AL, [DI]
MOV [SI], AL INC DI INC SI
LOOP AGAIN CODE ENDS
END START
四、编写一程序段统计数组ARY中负数的个数,并存入CONT单元中。(15分) 参考答案:
DATA SEGMENT
ARY DB 一1, 0, 3, 一6,7, 23,0,-50,3,1 CONT DB ? DATA ENDS MOV SI, 0 MOV BL, 0 MOV CX, 10 LOP:CMP ARY[SI], 0 JGE BIG INC BL
BIG:INC SI
LOOP LOP
MOV CONT, BL
五、编写一程序段,统计数据区BUF中0的个数,并存入RES单元。数据段为:(20分) DATA SEGMENT
BUF DB 0,5,0,3,2 RES DB ? DATA ENDS 参考答案: MOV CX,5
MOV SI,OFFSET BUF MOV BL,0
LOP:MOV AL,〔SI〕 CMP AL,0 JNE NEXT INC BL
NEXT:INC SI LOOP LOP
MOV RES,BL
六、编程序(30分)
在BUF1和BUF2两个数据区中,各定义有10个带符号字数据,试编制一完整的源程序,求它们对应项的绝对值之和,并将和数存入以SUM为首址的数据区中。 DATA SEGMENT
BUF1 DW -56,24,54,-1,89,-8,---- BUF2 DW 45,-23,124,345,-265,---- SUM DW 10 DUP(0) DATA ENDS 参考程序:
DATA SEGMENT
BUF1 DW -56,24,54,-1,89,-8,---- BUF2 DW 45,-23,124,345,-265,---- SUM DW 10 DUP(0)
DATA ENDS
STACK1 SEGMENT PARA STACK DW 20H DUP(0)
STACK1 ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATA
MOV DS,AX MOV CX,10 LEA SI,BUF1
LEA DI,BUF2
LEA BX,SUM
NEXT:MOV AX,[SI] MOV DX,[DI] TEST AX,8000H
JE TDX
NEG AX
TDX:TEST DX,8000H JE ADDS
NEG DX
ADDS:ADD AX,DX MOV [BX],AX ADD SI,2 ADD DI,2 ADD BX,2 LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START
第十二章 过程
一、下面的程序段有错吗?若有,请指出错误。(25分) CRAY PROC PUSH AX
ADD AX,BX
RET ENDP CRAY 参考答案:
程序最后一行有错,应写成:
CRAY ENDP
二、判断题(正确的画,错误的画)(共15分,每题5分) 1.寄存器传递参数法适合于参数较多的情况。(×) 2.用赋值法编写子程序时,子程序内必须修改返回地址。(√) 3.RET N指令中,N可为任意值。(×)
三、程序分析题(阅读程序段后给出答案)(共20分,每题10分) 1.
MOV AL,0FH MOV BL,10H CALL SUB1
INC AL
DEC BL SUB1 PROC
ADD AL,BL XCHG AL,BL
RET
SUB1 ENDP
上述程序段运行后,(AL)=( ),(BL)=( )。 答:(AL)=(11H),(BL)=(1EH)。 2.
MOV AL,38H MOV BL,49H CALL SUBO INC AL DEC CL
SUBO PROC ADD AL,BL MOV CL,AL DAA RET
SUBO ENDP
上述程序段运行后,(AL)=( ),(CL)=( ) 答:(AL)=(88H),(CL)=(80H)
四、简答题(共10分,每题5分)
在指令系统中,段内、段间返回均为RET指令。试回答: (1)执行段内返回RET指令时,执行的操作是: (2)执行段间返回RET指令时,执行的操作是: 答:
(1)执行段内返回:
栈顶内容→IP,SP+2→SP (2)执行段间返回:
栈顶内容→IP,SP+2→SP 栈顶内容→CS,SP+2→SP
五、编写子程序题(20分)
编写一个子程序,完成两个非压缩型BCD数(每个数均不大于99)的加法。两个入口参数分别在AX,BX中,结果仍放在AX中。若结果大于99,则CF置1。 参考答案: 子程序为:
ADD_BCD PROC PUSH CX MOV CH,AH
ADD AL,BL
AAA
XCHG AL,CH ADC AL,BH AAA
MOV AH,AL MOV AL,CH POP CX RET ADD_BCD ENDP
六、编程题(30分)
设在DAT单元存放一个-9~+9的字节数据,在SQRTAB数据区中存放了0~9的平方值,请用直接查表法编写一个子程序,在SQRTAB中查找出DAT单元中数据对应的平方值送SQR单元。要求子程序开始时必须利用堆栈保护用到的各寄存器,并在返回前恢复;主程序结构要书写完整(包括子程序的调用方式)(结果不必输出)。其中数据段如下: DATA SEGMENT DAT DB -6
SQRTAB DB 0,1,4,9,16,25,36,49,64,81 SQR DB ? DATA ENDS 参考答案:
DATA SEGMENT DAT DB -6
SQRTAB DB 0,1,4,9,16,25,36,47,64,81 SQR DB ?
DATA ENDS
STACK SEGMENT PARA STACK DW 20H DUP(?) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX CALL SUBROT MOV AH,4CH INT 21H SUBROT PROC PUSH AX
PUSH BX
LEA BX,SQRTAB MOV AL,DAT