为什么这条汇编线无法使用寄存器'?

时间:2015-05-15 05:26:39

标签: assembly x86 memory-mapping

我正在阅读一些操作系统开发教程,我不断看到以下代码部分:

.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交叉汇编程序。

1 个答案:

答案 0 :(得分:4)

在其他32位代码中使用16位寄存器表明这是古代“神奇”代码的片段,在父母的仪式中从父亲传给儿子。在此期间,汇编程序支持的语法发生了变化,因此您正在使用的现代汇编程序不再接受这条曾经完全有效的行。

这一行

mov [es:di + 20], dword 1

通常写为

mov dword ptr es:[di + 20], 1

这是英特尔在其手册中使用的符号。