2013-01-18 2 views
0

Я начинаю с asm, поэтому я некоторое время занимался исследованием своего вопроса, но, похоже, был неудовлетворительным. Мне интересно, как отображать содержимое PSW на стандартном выходе. Другое дело, как отображать значение указателя инструкций? Я был бы очень признателен, если бы ypu мог дать мне подсказку (или, лучше, код кода). Это может быть masm или 8086 (на самом деле я не знаю, какая разница):Отображение содержимого PSW

ответ

0

Указатель команд не доступен непосредственно в семействе 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-битном режиме

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