硬盘和显卡的访问与控制(二)——《x86汇编语言:从实模式到保护模式》读书笔记02 (2)

app_lba_start equ 100 ;声明常数(用户程序起始逻辑扇区号)
这句话作者假定用户程序从硬盘第100扇区开始。所以在我们把这个源文件对应的.bin文件写入虚拟硬盘的时候,要从逻辑扇区100开始写。

equ 类似于C语言中的#define,用来定义一个常量。
一般使用格式:
符号名 EQU 表达式
作用是左边的符号名代表右边的表达式。
注意:不会给符号名分配存储空间,符号名不能与其它符号同名,也不能被重新定义

SECTION mbr align=16 vstart=0x7c00
解释:
NASM编译器用SECTION或者SEGMENT来定义段。mbr是段名称(可以随便起);
注意:如果整个程序都没有段定义语句,那么整个程序自成一个段(这点好像和MASM不同哦!);
align=16 表示16字节对齐;
vstart=0x7c00,关于这个,我们就不得不多说几句了。

==================插叙部分================
汇编地址以及标号的本质:
1. 所谓汇编地址,就是编译器给源程序中每条指令定义的地址,由于编译后的程序可以在内存中浮动(即可以装载在内存中的任意位置),因此直接用绝对地址(20位的实模式下的物理内存地址)来给源程序中的指令定位的话将不利于程序在内存中的浮动;
2. 汇编地址定位规则:
(1)一般规则:
i. 如果在没有使用特殊指令的一般情况下(特别是vstart指令),整个源程序中第一条指令的汇编地址为0,之后所有指令的汇编地址都是相对于整个源程序第一条指令的偏移地址,即使程序中分了很多段也是如此。在这种情况下,如果将整个源程序看做一个段的话则汇编地址就是段内偏移地址;
ii. 在NASM中,所有的标号实质上就是其所在处指令的汇编地址,在编译后会将所有标号都替换成该汇编地址值(即立即数);
(2)特殊规则:
i. 如果在定义段的时候使用了vstart伪指令,比如
“section my_segment vstart=15”,
则会提醒汇编器,该段起始指令的汇编地址是15,段内的其它指令的汇编地址都是距该段起始指令地址的偏移量加上15;因此,vstart伪指令就是指定段的起始汇编地址;如果vstart=0,则段内的汇编地址就是段内的偏移地址!(这种手法经常使用!)
ii. 使用NASM规则的标准段,是指section .data、section .text、section .bss,这三种标准段都默认包含有vstart=0,因此段内的指令以及标号的汇编地址都是段内偏移地址,并且在加载程序的时候会自动使cs指向.text,ds指向.bss,es指向.data,而无需人手工执行对段寄存器赋值的步骤,而对于i.中的定义段的方式则没有这种自动的步骤,需要亲手对段寄存器进行赋值(是这样吗?从网上搜来的,我不能肯定。)
(3) 引用标号:
i. 和MASM不一样的是NASM大大简化了对标号的引用,不需要再用seg和offset对标号取段地址和偏移地址了;
ii. 在NASM中,标号就是一个立即数,而这个立即数就是汇编地址;
iii. 在NASM中不再有MASM中数据标号的概念,也就不存在什么arr[5]之类的内存寻址形式了!
iv. 在NASM中所有出现标号的地方都会用标号的汇编地址替换,因此诸如mov ax, tag之类的指令,仅仅就是将一个立即数(tag的汇编地址)传送至ax而已,而不是取tag地址内的数据了!如果要取标号处内存中的数据就必须使用[ ](类似C语言中的指针运算符*);
==================插叙结束================

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsszg.html