15. 在数据段的BUFFER到BUFFER+24单元中存放着一个字符串,请判断该字符串中是
否存在数字,如有则把X单元置1,如无数字则将X单元置0。 ? 将字符串依次取到寄存器中;
? 将字符的ASCII码与30H~39H比较,在此范围则为数字; ? 发现数字,则置X单元,并结束搜索。
16. 从键盘上输入两个字符存于A,B单元中,比较它们的大小,并在屏幕上显示两个数的
大小关系。
STACK SEGMENT STACK DW 256 DUP(?) STACK ENDS DATA SEGMENT
A DB ? B DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA START:MOV AX,DATA MOV DS,AX
MOV AH,1 INT 21H
MOV A,AL MOV AH,1 INT 21H MOV B,AL CMP A,AL JGE AGB MOV DL,‘B’ MOV BL,‘A’
JMP DISP
AGB:MOV DL,‘A’
MOV BL,‘B’ DISP:MOV AH,2 INT 21H MOV DL,‘>’
INT 21H
MOV DL,BL INT 21H
MOV AH,4CH
INT 21H CODE ENDS END START
17. 内存BUF开始的单元中存放6个无序数,请用冒泡法将它们按递增顺序排序。
26
STACK SEGMENT STACK DW 256 DUP(?)
STACK ENDS DATA SEGMENT
A DW 34,78,65,21,66,90 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA START:MOV AX,DATA MOV DS,AX
MOV CX,6 DEC CX
A1:MOV DI,CX
MOV BX,0 A2:MOV AX,A[BX]
CMP AX,A[BX+2]
JLE A3
XCHG AX,A[BX+2] MOV A[BX],AX A3:ADD BX,2
LOOP A2
MOV CX,DI LOOP A1
MOV AH,4CH
INT 21H CODE ENDS
END START
18. 在内存缓冲区中有两个64位数,试编程实现这两个64位数相减的运算,要求定义至少
一个过程。
STACK SEGMENT STACK DW 256 DUP(?) STACK ENDS DATA SEGMENT
DAT1 DQ 122354AF76432AB3H
DAT2 DQ 1187ABC76FE54DD1H DAT3 DQ ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA START:MOV AX,DATA MOV DS,AX
CALL SUBB
MOV AH,4CH
27
INT 21H
SUBB PROC NEAR
MOV BX,OFFSET DAT1 MOV SI,OFFSET DAT2 MOV DI,OFFSET DAT3
MOV CX,4
CLC
AGAIN:MOV AX,[BX]
SBB AX,[SI]
MOV [DI],AX INC BX INC BX INC SI INC SI INC DI INC DI
LOOP AGAIN RET
SUBB ENDP
CODE ENDS END START
19. 设计一个子程序,它能完成在屏幕上输出空行的功能,空行的行数在CX寄存器中。试
将此功能用于你的程序中。 DISP PROC NEAR LOP:MOV DL,0DH MOV AH,2 INT 21H
MOV DL,0AH INT 21H LOOP LOP RET
DISP ENDP
20. 定义两个过程,分别实现以下功能: (1)非压缩BCD码转换为压缩BCD码 BCDTR1 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH SI
PUSH DI
MOV SI,OFFSET BUF1 ;非压缩BCD码 MOV DI,OFFSET BUF2 ;压缩BCD码 MOV AL,[SI]
28
AND AL,0FH MOV BL,[SI+1] AND BL,0FH MOV CL,4 SHL BL,CL OR AL,BL MOV [DI],AL POP DI POP SI POP CX POP BX POP AX
RET
BCDTR1 ENDP
(2)压缩BCD码转换为非压缩BCD码 BCDTR2 PROC NEAR PUSH AX PUSH CX PUSH SI
PUSH DI
MOV SI,OFFSET BUF1 ;非压缩BCD码 MOV DI,OFFSET BUF2 ;压缩BCD码 MOV AL,[DI] AND AL,0FH MOV [SI],AL MOV AL,[DI] MOV CL,4 SHR AL,CL MOV [SI+1],AL POP DI POP SI POP CX POP AX RET
BCDTR2 ENDP
21. 编程(包含子程序)实现对两个数组求和的功能,设两个数组的类型相同,数组元素个
数也相同。
? 依次取出两个数组的元素,按序相加,结果存放在和数组中; ? 设置一个计数值,控制加法的次数。
22. 编写一个完整的程序,要求把含有22H,32H,42H,52H四个字符数据的数据区复制
15次。
? 定义字符数据区和待复制的区域; ? 复制功能可以用串传送来实现;
29
? 15次复制用循环方式控制。
23. 编写程序,求1~150之间的能同时被2和3整除的整数之和。
? 从1开始判断每个数是否能被2整除,不能被2整除则更新为下一个数; ? 能被2整除则再判断是否能被3整除,如能整除则累加该数;
? 当该数更新为150时,则停止。
第7章 系统功能调用及其应用
1. 什么叫DOS系统功能调用?举一个例子说明实现DOS系统功能调用的一般步骤。
在多用户和多任务的环境下,与硬件有关的ROMBIOS资源只允许操作系统这个特殊用户使用,用户只可以使用INT 21H功能调用,包括字符输入、字符输出、磁盘控制、文件管理、记录操作、目录操作、动态存储分配等功能。
中断类型21H是DOS功能调用的主体,它提供了众多的非常强大的功能供用户调用,功能号由寄存器AH提供。在发INT 21H软中断之前,应该先准备好入口参数(也称调用参数),并将功能号送入AH寄存器中。
例如:由键盘输入单个字符
MOV AH,1 ;系统调用功能号送AH INT 21H
输入字符的ASCII码在AL寄存器中,同时字符显示在屏幕上。
2. 什么叫BIOS系统功能调用?举一个例子说明实现BIOS系统功能调用的一般步骤。 IBMDOS.COM包括一个文件管理程序和一些处理程序,在DOS下运行的程序可以调用这些处理程序。IBMDOS.COM是通过把信息传送给IBMBIO.COM,形成一个或多个BIOS调用,来完成DOS功能调用的。
BIOS存放在内存的最高端,是由功能模块组成的,可以通过软中断指令调用这些功能模块,故又称为BIOS中断调用。ROM BIOS使用了中断向量码00H?1FH。
例如:键盘I/O中断调用INT 16H 该中断调用16H有三个功能,功能号0?2。 (AH)= 0为从键盘读字符到AL寄存器中。
入口参数:无。
出口参数:AL中为键入字符的ASCII码,AH为键入字符的扫描码。 调用方法为: MOV AH,0 INT 16H
3. 在图形方式下,与显示图形相关的系统功能调用主要有哪些?
ROM BIOS显示器中断服务(INT 10H)
服务号 00H 01H 02H 03H 04H 05H
功 能 设置显示方式 设置光标大小 设置光标位置 读取光标坐标 读取光笔位置 设置当前显示页 服务号 0DH 0EH 0FH 10H 11H 12H 功 能 读象素 以TTY方式写字符 读取当前显示方式 显示寄存器控制 字符发生器控制 替换选择 30