0

我是 asm 的初学者,所以我一直在研究我的问题,但答案并不令人满意。我想知道如何在标准输出上显示 PSW 内容。其他的,如何显示指令指针值?如果 ypu 能给我一个提示(或者更好的代码),我将非常感激。它也可能是masm或8086(实际上我不知道有什么区别:))

4

1 回答 1

0

指令指针在 x86 系列上不能直接访问,但是,检索它的值非常简单——尽管它永远不会准确。由于子程序调用将返回地址放在堆栈上,因此您只需从那里复制它并 violá!您有以下call指令的操作码地址:

proc getInstructionPointer
    push bp
    mov bp,sp

    mov ax,[word ptr ss:bp + 2]

    mov sp,bp
    pop bp
    ret
endp getInstructionPointer

x86 上的 PSW 称为标志寄存器。有两个明确引用它的操作:pushfpopf. 正如您可能已经猜到的那样,您可以简单地将标志压入堆栈并将其加载到您喜欢的任何通用寄存器中:

pushf
pop ax

显示这些值包括将它们的值转换为 ASCII 并将它们写入屏幕。有几种方法可以做到这一点 - 搜索“字符串输出程序集”,我敢打赌你会找到答案。

消除一个小混淆:8086 是 CPU 本身,而 MASM 是汇编器。语法是特定于汇编器的;MASM 程序集是 x86 程序集。TASM 程序集也是 x86 程序集,就像 NASM 程序集一样。当一个人说“x86 汇编”时,他/她指的是这些(或其他)中的任何一个,谈论的是指令集,而不是方言。

请注意,以上示例是 16 位的,用于 8086,不适用于 32 位模式下的 80386+

于 2013-04-14T14:58:39.143 回答