Проблема заключается в буквальном сообщении об ошибке, предоставленном ассемблером: «Недопустимая комбинация кода операции и операндов». Инструкция 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-разрядная версия).
Вы даже прочитали инструкцию? Даже скромный 8086 (предположительно из 'al') может' push' или 'pop' 8-битный регистр. –
Я бы предложил вам google для «набора инструкций 8086», и особенно для «адресных модов», и попытайтесь понять, что означает все это «r32, r/m32» и т. Д. – Tommylee2k