8.4 习题

8.1、简述中断和子程序调用之间的主要区别?

8.2、为什么要区分IRET指令与RET指令?

8.3、编写一个子程序,它可显示以0结尾的字符串。子程序的入口参数DS:DX为待输出字符串的首地址。

8.4、编写一个子程序,用来读入一个键,并在屏幕上按十六进制的形式显示按键的扩展ASCII码,如果按键为普通字符,则不显示。

8.5、编写一个程序,在屏幕的右下角闪烁显示编程者自己的姓名,显示颜色自定。

8.6、编写一个把屏幕上显示的字母经过大小写转换后再显示的程序。

8.7、编写一个程序,它把屏幕上的数字改位蓝绿色背景的红字。

8.8、编写一个控制光标位置和形状的程序,该程序具有以下功能:

1)、可用光标移动键↑、↓、←和→来移动光标;

2)、当光标已在第0列,且按'←'键时,光标定在上一行的最后一列;若已在屏幕的左上角,则光标不动,且给出响铃;按'→'键时的边界处理类似;

3)、当光标在第0行,且按'↑'键时,则光标不动,且给出响铃;按'↓'键时的边界处理类似;

4)、按Home或End键,则光标移到当前行的行首或行尾;

5)、若按下数字或字母键,则把该字符从当前位置依次显示到屏幕顶(在新位置显示字符时,原位置的符号被抹去);

6)、按Esc键,程序结束。

8.9、交换例8.5和8.6的画线方法,编写相应的子程序VLine和HLine,并验证之。

8.10、假设显示器的显示模式设定为12H,编写实现下列功能的程序:

1)、在屏幕中间从上到下显示一条明亮的蓝色线,线宽为1个像素;
2)、在屏幕底下横向画一条绿色线,线宽为2个像素;
3)、在屏幕上垂直显示16种颜色,每种颜色宽40个像素;
4)、设定屏幕背景为白色,在屏幕中间画一条青色线,线宽为10个像素。

8.11、对于256色,320X200的显示模式需要多少个字节的内存存放一屏信息?

8.12、为什么在显示数据时必须关闭鼠标?

8.13、编写程序,检测计算机是否已安装了鼠标,并以显示Yes/No来表示检测结果。

8.14、编写程序,显示鼠标的按键,若按左键,显示"Left",若按右键,显示"Right",按Esc键,程序结束。

8.15、编写一个程序,在图形模式下,打开鼠标,并显示鼠标的位置。

8.16、编写一个程序,显示驱动器C根目录下所有EXE文件。提示:用通配符"*.exe"来查找与此匹配的文件名,找到后,显示之。

8.17、编写一个程序,显示驱动器C根目录下的所有子目录。

8.18、编写一个程序,设置指定目录下的所有文件为只读文件。

8.19、编写一个程序,创建一个隐含文件Data.TXT。

8.20、编写一个程序,把键盘上输入写入文件File.dat中,类似以下DOS命令:

COPY con File.dat

8.21、使用哪个DOS功能可读取中断向量地址,哪个DOS功能可把新的中断服务程序地址设置为指定中断的入口地址。

8.22、编写一个程序,在程序开始运行时,把中断向量表保存到程序的数据段中,在程序结束前把数据段中的备份恢复到系统中去。

8.23、把下列C语言的子程序改写成汇编语言子程序。

1)、取当前光标的位置,并分别存入变量x和y中

get_cursor(int *x, int *y)
{union REGS in, out;
 in.h.ah = 3;   in.h.bh = 0;
 int86(0x10, &in, &out);
 *x = out.h.dh;  *y = out.h.dl;
}

2)、把光标设置在(row, col)位置

locate(int row, int col)
{union REGS in, out;
 in.h.ah = 2;   in.h.bh = 0;
 in.h.dh = row;  in.h.dl = col;
 int86(0x10, &in, &out);
}

3)、在(row, col)位置显示字符串string

disp_string(int row, int col, char string[])
{struct REGPACK  in, out;
 int   x, y;
 get_cursor(&x, &y);
 locate(row, col);
 in.r_ds = FP_SEG(string);
 in.r_dx = FP_OFF(string);
 in.r_ax = 0x900;
 intr(0x21, &in);
 locate(x, y);
}