这是一个boot.s文件,用于构建最简单的操作系统,符合GNU多引导规范:
MBOOT_HEADER_MAGIC equ 0x1BADB002
MBOOT_PAGE_ALIGN equ 1 << 0
MBOOT_MEM_INFO equ 1 << 1
MBOOT_HEADER_FLAGS equ MBOOT_PAGE_ALIGN | MBOOT_MEM_INFO
MBOOT_CHECKSUM equ - (MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)
[BITS 32]
section .text
dd MBOOT_HEADER_MAGIC
dd MBOOT_HEADER_FLAGS
dd MBOOT_CHECKSUM
[GLOBAL start]
[GLOBAL glb_mboot_ptr]
[EXTERN kern_entry]
start:
cli
mov esp, STACK_TOP
mov ebp, 0
and esp, 0FFFFFFF0H
mov [glb_mboot_ptr], ebx
call kern_entry
stop:
hlt
jmp stop
section .bss
stack:
resb 32768
glb_mboot_ptr:
resb 4
STACK_TOP equ $-stack-1
我想知道这些括号在[BITS 32]或[GLOBAL start]中意味着什么?是声明还是获取地址的操作?我只知道声明变量如
GLOBAL start
或获取地址
mov [esi], eax
当他们结合在一起时,我感到很困惑。
答案 0 :(得分:2)
没有括号的表单是一个宏。主要区别在于宏形式将采用多个参数。
extern scanf, printf, exit
在内部转换为:
[extern scanf]
[extern printf]
[extern exit]
参见友情手册: http://www.nasm.us/xdoc/2.11.05/html/nasmdoc6.html
我曾经认为使用括号“看起来很酷”,但已经决定最好保存括号作为内存引用。