Почему эта сборочная линия является "неправильным использованием регистра"?

Я изучаю некоторые руководства по разработке ОС и постоянно вижу следующий раздел кода:

.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 ответ

Решение

Использование 16-битных регистров внутри 32-битного кода предполагает, что это фрагмент древнего "магического" кода, передаваемого от отца к сыну в ритуалах эльдрича. За это время поддерживаемый синтаксис ассемблеров изменился, и поэтому однажды совершенно корректная строка больше не принимается современным ассемблером, который вы используете.

Эта линия

mov [es:di + 20], dword 1

чаще пишется как

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

это обозначение, используемое Intel в своих руководствах.

Другие вопросы по тегам