用C调用BIOS中断,读键函数帮忙解释一下

来源:百度知道 编辑:UC知道 时间:2024/07/04 18:29:42
首先申明一下,我不会汇编,咱们直接切入正题:
int key() /*读键函数*/
{
union REGS rg;
rg.h.ah=0;
int86(0x16,&rg,&rg);
return rg.h.ah;
}
这是个读键函数,在此我有以下问题:
1.REGS是哪几个字母的缩写;
2.在程序的第四行中, 有rg.h.ah=0; 请问:为什么是对成员ah赋值,而不是对其他的成员,如:al,bl,cl等等赋值;ah成员有什么特别的语义含义吗?
3.同样是在第四行,还是那条语句,为什么要对ah赋值为零???为什么!
4.关于int86()函数,我知道第一个参数是执行的BIOS中断的类型号,为什么是0x16?这个和我们知道的BIOS中断号不一样啊!怎么转换的?
5.最后请你把int86()函数的最后两个参数也给说说吧,他们是什么作用
谢谢大家!

int key()
{
union REGS rg;\\定义联合体-〉寄存器=rg
rg.h.ah=0;\\等同于汇编 mov ah 00h,赋值是为了初始化)
int86(0x16,&rg,&rg);\\等同于c语言int 16h)
return rg.h.ah;\\返回AX高字节的值
}

1. REGS是CPU的一个寄存器的集合,也就是寄存器集合(Registers)的缩写

2. 这句话的作用是进行寄存器的初始化(所有的I/O指令都使用AH&AL寄存器与外界设备传送数据),等同于mov ah 00h
数据寄存器分为:
AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.
BH&BL=BX(base):基址寄存器,常用于地址索引;
CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.
DH&DL=DX(data):数据寄存器,常用于数据传递。
他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用

3.同上,AH寄存器置0,就是为了初始化寄存器

4.
0x16这个是标明进行键盘中断int 16h的调用,记住就行了。
第1个参数:intno=0x16; //调用键盘中断int 16h
第2个参数:inregs为调用时个寄存器的值;
第3个参数:oregs为调用后返回时各寄存器的状态值,

5.
int86() 函数的功能是提供通用的 8086 软中断接口(关于中断信息,请自行参考相关文档或书籍)。
其原型是: int86(int intno, union REGS* inregs, union REGS* ou