;===============================================================================
SECTION core_data vstart=0 ;系统核心的数据段
;-------------------------------------------------------------------------------
pgdt dw 0 ;用于设置和修改 GDT
dd 0
ram_alloc dd 0x00100000 ;下次分配内存时的起始地址
;符号地址检索表
salt:
salt_1 db '@PrintString'
times 256-($-salt_1) db 0
dd put_string
dw sys_routine_seg_sel
salt_2 db '@ReadDiskData'
times 256-($-salt_2) db 0
dd read_hard_disk_0
dw sys_routine_seg_sel
salt_3 db '@PrintDwordAsHexString'
times 256-($-salt_3) db 0
dd put_hex_dword
dw sys_routine_seg_sel
salt_4 db '@TerminateProgram'
times 256-($-salt_4) db 0
dd return_point
dw core_code_seg_sel
salt_item_len equ $-salt_4
salt_items equ ($-salt)/salt_item_len
如上代码来自书籍 x86 从实模式到保护模式。equ 好像是 NASM 编译器的伪指令。
这是 部分的内核代码,如上是,内核的数据段的描述。 里面有一个符号对应表:每个符号包括三部分:
- 字符串
- 函数在段内的偏移
- 函数所在的系统例程段的选择子
上面这个salt_items应该是 4 ,salt_item_len应该是 256+6=262 。
-
salt_item_len equ $-salt_4这一句是可以理解为,计算出了salt_4标号后面的 db dd dw 的总和吗?但书中原话又说了$-salt_4是标号 salt_4 的汇编地址,如果是这样,那么这句也是不对的。 -
salt_items equ ($-salt)/salt_item_len这一句则完全不理解,除法前面的是salt,即符号表的基地址,放到这里除 不太对吧?