Я начинаю с asm, поэтому я некоторое время занимался исследованием своего вопроса, но, похоже, был неудовлетворительным. Мне интересно, как отображать содержимое PSW на стандартном выходе. Другое дело, как отображать значение указателя инструкций? Я был бы очень признателен, если бы ypu мог дать мне подсказку (или, лучше, код кода). Это может быть masm или 8086 (на самом деле я не знаю, какая разница):Отображение содержимого PSW
ответ
Указатель команд не доступен непосредственно в семействе x86, однако довольно просто получить его значение - оно никогда не будет точным. Поскольку вызов подпрограммы помещает обратный адрес в стек, вам просто нужно его скопировать и выполнить! У вас есть адрес опкодом следуя инструкции call
:
proc getInstructionPointer
push bp
mov bp,sp
mov ax,[word ptr ss:bp + 2]
mov sp,bp
pop bp
ret
endp getInstructionPointer
ЗУ на x86 называется регистр флагов. Есть две операции, которые явно ссылаются на нее: pushf
и popf
. Как вы уже догадались, вы можете просто нажать на флаги в стек и загрузить его в любой регистра общего назначения вам нравится:
pushf
pop ax
Отображение этих значений состоит из преобразования их значения ASCII и записывать их на экран. Есть несколько способов сделать это - найти «сборку строк», я уверен, вы нашли ответ.
Чтобы устранить незначительную путаницу: 8086 - это сам процессор, тогда как MASM - это ассемблер. Синтаксис специфичен для ассемблера; Узел MASM - сборка x86. Сборка TASM также является сборкой x86, как и сборка NASM. Когда кто-то говорит «x86 Assembly», он ссылается на любую из этих (или других), говоря о наборе команд, а не диалекте.
Обратите внимание, что приведенные выше примеры являются 16bit, indtended для 8086 и не будет работать на 80386+ в 32-битном режиме