2017-01-04 10 views
-2

Каждый раз, когда я пытаюсь скомпилировать свой код с NASM, где есть «pop» («pop al» в этом случае), это дает мне ошибку.NASM (Intel) Ошибка ASM по умолчанию

20: error: invalid combination of opcode and operands 

В строке 20, у меня есть

pop al 

В чем проблема?

+4

Вы даже прочитали инструкцию? Даже скромный 8086 (предположительно из 'al') может' push' или 'pop' 8-битный регистр. –

+1

Я бы предложил вам google для «набора инструкций 8086», и особенно для «адресных модов», и попытайтесь понять, что означает все это «r32, r/m32» и т. Д. – Tommylee2k

ответ

5

Проблема заключается в буквальном сообщении об ошибке, предоставленном ассемблером: «Недопустимая комбинация кода операции и операндов». Инструкция POP не может кодировать POP r8. Другими словами, вы не можете поп 8-битное значение из стека

Ближайшим эквивалентом будет pop ax, которая использует кодирование POP r16 поп 16-битное значение из стека в регистр ax. Однако это не совсем то же самое, что и ваш код, поскольку он будет изменять как нижнюю 8-битную половину (al), так и верхнюю 8-битную половину (ah) 16-разрядного регистра .

Другой альтернативой является загрузка значения непосредственно из стека, используя что-то вроде mov al, BYTE PTR [(r/e)sp]. Поскольку это не изменяет указатель стека, вам нужно будет отрегулировать его вручную.


В следующий раз, пожалуйста, укажите, что такое целевая платформа. Это важно, потому что 16-битный реальный режим имеет очень ограниченные возможности для режимов адресации по сравнению с 32-битным и 64-битным защищенным режимом. Если вы не укажете, какой режим вы планируете, полученные ответы могут не сработать для вас. Как и здесь, я не знаю, должна ли эта инструкция mov использовать rsp (64-разрядная версия), esp (32-разрядная версия) или sp (16-разрядная версия).

 Смежные вопросы

  • Нет связанных вопросов^_^