第十六章——直接定址表
1、code segment
a: db 1,2,3,4,5,6,7,8
b: dw 0
code segment
a db 1,2,3,4,5,6,7,8
b dw 0
我们在code段中使用的标号a,b后面没有“:”,因此它们是可以同时描述内存地址和单元长度的标号。
标号a,描述了地址code:0,和从这个地址开始,以后的内存单元都是字节单元。
而标号b描述了地址code:8,和从这个地址开始以后的内存单元都是字单元。
因为这种标号包含了对单元长度的描述,所以,在指令中,它可以代表一个段中的内存单元。
例:对于程序中的b dw 0.
指令:mov ax,b 相当于:mov ax,cs[8]
指令:mov b,2 相当于:mov word ptr cs:[8],2
指令:inc b 相当于:inc word ptr cs:[8]
在这些指令中,标号b代表了一个内存单元,地址为
code:8,长度为2字节。
对于程序中的a db 1,2,3,4,5,6,7,8
指令:mov al,a[si]
相当于:mov al,cs:0[si]
指令:mov al,a[3]
相当于:mov al,cs:0[3]
指令:mov al,a[bx+si+3]
相当于:mov al,cs:0[bx+si+3]
可见,使用这种包含单元长度的标号,可以使我们以简洁的形式访问内存中的数据。我们将这种标号称为数据标号,它标记了存储数据的单元的地址和长度。
2、一般来说,我们不会在代码段中定义数据,而是将数据定义到其他段中。在其他段中,我们也可以使用数据标号来描述存储数据的单元的地址和长度。
3、在后面加有“:”的地址标号,只能在代码段中使用,不能在其他段中使用。
4、如果想在代码段中,直接用数据标号访问数据,则需要用伪指令assume将标号所在的段和一个段寄存器联系起来。否则编译器在编译的时候,无法确定标号的段地址在哪一个寄存器中。这种联系是编译器需要的,但绝对不是说,我们因为编辑器的工作需要,用assume指令将段寄存器和某个段相联系,段寄存器中就会真的存放该段的地址。
5、Seg操作符:功能为取得某一标号的段地址。
6、数值0~9和字符“0”~“9”之间的映射:
数值+30h=对应字符的ASCII值
10~15和“A”~“F”之间的映射关系是:
数值+37h=对应字符的ASCII值。
7、可以通过依据数据,直接计算出所要找的元素的位置的表,称为:直接定址表。
第十七章——BIOS输入和磁盘读写
1、BIOS的int 9中断例程和int 16h中断例程是一对相互配合的程序,int 9中断例程向键盘缓冲区写入,int 16h中断例程从缓冲区中读出。
2、它们写入和读出的时机不同,int 9中断例程在有键按下的时候向键盘缓冲区中写入数据。而int 16h中断例程是在应用程序对其进行调用的时候,将数据从键盘缓冲区读出。
3、常用的3.5英寸软盘的结构:分为上下两面,每面有80个磁道,每个磁道又分为18个扇区,每个扇区的大小为512B.总容量为:2*80*18*512B=1440kb
4、磁盘的实际访问由磁盘控制器进行,我们可以通过控制磁盘控制器来访问磁盘。
5、我们只能以扇区为单元对磁盘进行读写。在读写扇区的时候,要给出面号,磁道号和扇区号。面号和磁道号从0开始,而扇区号从1开始。