Почему эта сборочная линия является "неправильным использованием регистра"?
Я изучаю некоторые руководства по разработке ОС и постоянно вижу следующий раздел кода:
.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 в своих руководствах.