我正在阅读一些操作系统开发教程,我不断看到以下代码部分:
.intel_syntax noprefix
do_e820:
xor ebx, ebx # ebx must be 0 to start
xor bp, bp # keep an entry count in bp
mov edx, 0x0534D4150 # Place "SMAP" into edx
mov eax, 0xe820
mov [es:di + 20], dword 1 # <<<this is the line I don't get
mov ecx, 24 # ask for 24 bytes
int 0x15
jc short .failed # carry set on first call means "unsupported function"
mov edx, 0x0534D4150 # Some BIOSes apparently trash this register?
cmp eax, edx # on success, eax must have been reset to "SMAP"
jne short .failed
test ebx, ebx # ebx = 0 implies list is only 1 entry long (worthless)
je short .failed
jmp short .jmpin
当我尝试为我的自制内核组装它时,汇编程序在我标记的行上抱怨Error: invalid use of register
。如果它有助于了解情况,我使用的是gcc i686-elf交叉汇编程序。
答案 0 :(得分:4)
在其他32位代码中使用16位寄存器表明这是古代“神奇”代码的片段,在父母的仪式中从父亲传给儿子。在此期间,汇编程序支持的语法发生了变化,因此您正在使用的现代汇编程序不再接受这条曾经完全有效的行。
这一行
mov [es:di + 20], dword 1
通常写为
mov dword ptr es:[di + 20], 1
这是英特尔在其手册中使用的符号。