ADD AL,30H ; BCD码转ASCII码 MOV [BX],AL DEC SI DEC DI DEC BX LOOP A20 POPF ADD AH,30H MOV [BX],AH 3) MOV CX,4 LEA SI,MULCND+3 LEA DI,PRODUCT+4 AND MULPLR,0FH ; ASCII码转BCD码 A30: MOV AL,[SI] AND AL,0FH ; ASCII码转BCD码 MUL MULPLR AAM ; BCD码乘调整 ADD AL,[DI] AAA ; BCD码加法调整 OR AL,30H MOV [DI],AL DEC DI MOV [DI],AH DEC SI LOOP A30 OR BYTE PTR [DI],30H
13. 请编写完整程序在一个升序字节数组中查找数N,找到后将此数从数组中删除,并
使得CF=0;没找到返回CF=1。数组的首地址和末地址为A_HEAD和A_END。 答:
DATA SEGMENT PARA 'DATA' A_HEAD DW ? BUFF DB 1,2,3,4,5,6,7,8,9,0 COUNT EQU $-BUFF A_END DW ? N DB 4
DATA ENDS
CODE SEGMENT PARA 'CODE' ASSUME CS:CODE, DS: DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFF
16
MOV A_HEAD,SI MOV AL,COUNT CBW ADD AX,SI MOV DI,AX DEC DI MOV A_END,DI MOV AL,N LP: CMP AL,[SI] JNE NEXT JMP DEL
NEXT: INC SI ;考察下一个数据 CMP SI,DI JBE LP ;循环 STC ;CF<-1 JMP EXIT
DEL: CLC ;CF<-0 CMP SI,DI
JNE DELDATA DEC A_END ;删除的是最后一个元素 JMP EXIT DELDATA:MOV CX,DI SUB CX,SI
LP2: MOV AL,[SI+1] ;该循环将SI+1到DI位置的数据移动到SI到DI-1的位置 MOV [SI],AL INC SI LOOP LP2 DEC A_END ;调整结尾指针 EXIT: MOV AH,4CH INT 21H CODE ENDS END START
14. 请编写完整程序从键盘读取字符,如果是十进制的‘0’~‘9’则在屏幕上输出该
数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是’Q’或者‘q’,则程序退出,其他情况在屏幕上打印“You must input 0~9, or ‘q’ or ‘Q’”。 (如输入的字符是‘9’,则输出“00001001”)
提示:语句“You must input 0~9, or ‘q’ or ‘Q’”定义成以’$’结尾的字符串,键盘输入和屏幕输出,请参看教材后的DOS功能调用(int 21h)的相关功能。
输出一个数的2进制形式应该从最高位开始输出,可以将此段程序定义成一个过程。 答:
;'\。
DATA SEGMENT PARA 'DATA'
17
sentence db 'You must input 0~9, or \ buf db 20 dup(?) DATA ENDS
CODE SEGMENT PARA 'CODE' ASSUME CS:CODE, DS: DATA MAIN PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV SI,0 DOIT: MOV AH,1 INT 21H CMP AL,'Q' JNE NEXT JMP EXIT NEXT: CMP AL,'q' JNE NEXT1 JMP EXIT NEXT1: SUB AL,30H JC PRINT JMP NEXT2 PRINT: MOV AH,9 LEA DX,SENTENCE INT 21H CALL CRLF JMP DOIT NEXT2: CMP AL,9 JG PRINT MOV CX,8 CALL CRLF PRNDATA:SHL AL,1 JC IS1 MOV DL,'0' JMP OUTBIN IS1: MOV DL,'1'
OUTBIN: PUSH AX MOV AH,2 INT 21H POP AX LOOP PRNDATA CALL CRLF JMP DOIT
18
EXIT: RET MAIN ENDP CRLF PROC NEAR ;回车换行 PUSH AX PUSH DX
MOV DL, 0DH ;回车 MOV AH, 2
INT 21H ; 输出DL中的字符 MOV DL, 0AH ; 换行 MOV AH, 2
INT 21H POP DX POP AX RET CRLF ENDP CODE ENDS END MAIN
; 输出DL中的字符 19
第5章
4. 什么是端口?I/O端口的编址方式有哪几种?各有何特点?在8086/8088系统中采用哪种方法?在PC系列微机中端口的地址范围有多大?
答:CPU要和I/O设备进行数据传送,在接口中就必须有一些寄存器或特定的硬件电路供CPU直接存取访问,这就是I/O端口。为了区分不同的I/O端口,也必须像存储器一样给它们编号,形成I/O端口的地址。
I/O编址方式有统一编制方式与独立编制方式。
I/O统一编制方式主要优点:一是对I/O接口的操作与对存储器的操作完全相同,任何存储器操作指令都可用来操作I/O接口,而不必使用专用的I/O指令。二是可以使外设数目或I/O寄存器数目几乎不受限制,而只受总存储容量的限制,从而大大增加系统的吞吐率。三是使微机系统的读/写控制逻辑较简单。主要缺点:一是占用了存储器的一部分地址空间,使可用的内存空间减少;二是访问内存的指令一般较长,执行速度较慢;三是为了识别一个I/O端口,必须对全部地址线译码,这样不仅增加了地址译码电路的复杂性,而且使执行外设寻址的操作时间相对增长。
I/O独立编制优点是I/O端口地址不占用存储器地址空间。由于系统需要的I/O端口寄存器一般比存储器单元要少得多,因此选择I/O端口只需用8~10根地址线即可,这使得I/O端口地址译码较简单,寻址速度较快。使用专用I/O指令和真正的存储器访问指令有明显区别,可使程序编制得清晰,便于理解和检查。这种方式的缺点是专用I/O指令类型少,远不如存储器访问指令丰富,使程序设计灵活性较差;且使用I/O指令一般只能在累加器和I/O端口间交换信息,处理能力不如存储器映像方式强;尤其是要求处理器能提供存储器读/写及I/O端口读/写两组控制信号,这增加了控制逻辑的复杂性。
在8086/8088系统中采用I/O独立编制方式,PC系列危机中端口地址的范围是0~64K,但实际只使用0~1K。
5. 为什么一个状态或命令(控制)端口有时能为多个外设共享?
答:这是因为微机采用了3种方式来区别统一端口地址访问不同端口的问题: 1) 在数据位有空位的时候,使用1位到2位数据位作为标志位,来表明访问的是什么
端口。
2) 在数据位没有空位的时候,会采用时序的方法来区别是访问哪个端口 3) 也可以采用读写信号来区别所访问的端口。
6. 请简述I/O保护的实现原理。
答:首先要明确一点,在DOS环境(实地址模式)下,I/O是没有保护的,只有在保护模式下才有I/O的保护功能。
I/O保护有两种机构:I/O特权级IOPL(I/O Privilege Level)和I/O允许位映像(I/O Permission Bit Map)。EFLAG标志寄存器中IOPL字段定义使用I/O相关指令的权限;任务状态段TSS(Task State Segment)的I/O允许位映像用来修正IOPL对I/O敏感指令的影响,允许较低特权级的程序或任务访问某些I/O端口。
在保护方式下,当处理器遇到一条I/O指令(IN, INS, OUT和OUTS)时,它首先检查CPL 20 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库《现代微机原理与接口技术》第2版部分习题答案(4)在线全文阅读。
相关推荐: