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

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

.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.


person Jacob Calvert    schedule 15.05.2015    source источник
comment
Возможно, связано: stackoverflow.com/q/15066898   -  person Robert Harvey    schedule 15.05.2015
comment
@ Ира Бакстер, я имел в виду, я обновил вопрос для уточнения.   -  person Jacob Calvert    schedule 15.05.2015
comment
Вы должны удалить тег Memory-mapping. У вас проблема с ассемблером, а не с отображением памяти.   -  person Ira Baxter    schedule 15.05.2015


Ответы (1)


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

Эта линия

mov [es:di + 20], dword 1

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

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

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

person Jongware    schedule 15.05.2015
comment
Спасибо за полезный ответ. Я отмечаю вашу как принятую, но я хотел бы отметить, что даже вторая версия (которую я также пробовал, поскольку это обозначение, которое я нашел в одном из руководств в формате PDF) также отклонена как действующая инструкция. - person Jacob Calvert; 15.05.2015
comment
@JacobCalvert: спасибо, что попробовали и это! Я удалил это предложение, поэтому осталось только современное. - person Jongware; 15.05.2015