微机原理习题与实验-F 下载本文

① 寄存器传送。 ② 地址表传送,需要传送的参数较多时可以利用存储单元传送。在调用子程序前,把所有参数依次送入地址表,然后将地址表的首地址作为子程序入口参数传递给子程序。

③ 堆栈传送,这种方式要审慎注意堆栈的变化情况。

13. 过程定义的一般格式是什么?子程序开始处为什么常用PUSH指令?返回前

用POP指令?

解:过程定义的一般格式请参照《微机原理与接口技术》中的第100页的“4.4.5过程设计”一节。

如果一个子程序被多次调用,保护与恢复(主程序)现场就非常重要。主程序每次调用子程序时,主程序的现场不会相同,保护与恢复现场的工作就只能在子程序中进行。原则上,在子程序中,首先把子程序中要用到的寄存器、存储单元、状态标志等压入堆栈或存入特定空间中,然后子程序才可以使用它们,使用完后再将它们弹出堆栈或从特定空间中取出,恢复它们原来的值,即恢复主程序现场。保护和恢复现场常使用PUSH和POP指令。

14. 阅读下面程序段,指出它的功能。右图说明程序执行过程中堆栈的变化情况。

DATA SEGMENT

STRING DB ‘Exxperience?’ LENG DW 100 KEY DB ‘x’ DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA MAIN PROC FAR

START:MOV AX, DATA MOV DS, AX MOV ES, AX LEA BX, STRING LEA CX, LENG PUSH BX DI- PUSH CX DI+ MOV AL, KEY SI+ CALL DELCHAR SP->BP BP- MOV AH, 4CH BP+ INT21H IP- MAIN ENDP

IP+ DELCHAR PROC

[BP+4]->SI CL PUSH BP

CH MOV BP, SP

[BP+6]->DI BL PUSH SI

BH PUSH DI CLD MOV SI, [BP+4] MOV CX, [SI] MOV DI, [BP+6]

REPNE SCASB JNE DONE MOV SI, [BP+4] DEC WORD PTR[SI] MOV SI, DI DEC DI REP MOVSB DONE: POP DI POP SI POP BP RET DELCHAR ENDP CODE ENDS END START

解:从字符串中删去多余的X字符。

15. 显示两位压缩BCD码值(0~99),要求不显示前导0。

解:DATA SEGMENT

BUF DB ? ; 内存中的两位压缩BCD码 DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA

MOV DS,AX

MOV AL, BUF MOV BL,AL NEXT: MOV CL,4

SHR AL, CL AND AL,0FH CMP AL,0 JZ GOON ADD AL,30H ;显示高位BCD码 MOV DL,AL

MOV AH,2 INT 21H GOON: MOV AL,BL AND AL,0FH

ADD AL,30H ;显示低位BCD码 MOV DL,AL

MOV AH,2 INT 21H

MOV AH,4CH INT 21H

CODE ENDS

END START

16. 某数据区中连续存放着100个整数,要求将其中为0的元素删除,并将保留的

数据连续存放。

解:

DATA SEGMENT STRING DB 100(?) LENG DW 100 KEY DB 0 DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA MAIN PROC FAR

START:MOV AX, DATA MOV DS, AX MOV ES, AX LEA BX, STRING LEA CX, LENG PUSH BX PUSH CX MOV AL, KEY CALL DELCHAR MOV AH, 4CH INT21H MAIN ENDP

DELCHAR PROC PUSH BP MOV BP, SP PUSH SI PUSH DI CLD MOV SI, [BP+4] MOV CX, [SI] MOV DI, [BP+6] REPNE SCASB JNE DONE

MOV SI, [BP+4] DEC WORD PTR[SI] MOV SI, DI DEC DI REP MOVSB DONE: POP DI POP SI POP BP RET

DELCHAR ENDP CODE ENDS END START

17. 编程,把以DATA为首址的两个连续单元中的16位无符号数乘以10。

解:DATA SEGMENT

BUFFER DB A3H,27H DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA

MOV DS,AX LEA SI,BUFFER

MOV AX,[SI] SHL AX,1 MOV BX,AX MOV CL,3 MOV AX,[SI] SHL AX,CL ADD AX,BX MOV BUFFER,AL MOV BUFFER+1,AH

MOV AH,4CH INT 21H

CODE ENDS

END START

18. 编程,比较两个字串是否相同,并找出其中第一个不相等字符的地址,将该地

址送BX,不相等的字符送AL。两个字符串的长度均为200个字节,M1为源串首地址,M2为目标串首地址。

解:DATA SEGMENT

M1 DB 100DUP(?) DATA ENDS

EDATA SEGMENT

M2 DB 100DUP(?) EDATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ,ES:EDATA START: MOV AX,DATA

MOV DS,AX

MOV AX,EDATA MOV ES,AX LEA SI,M1 ;(SI)←源串首地址

LEA DI,M2 ;(DI)←目标串首地址