Question

I'm beginner with asm, so I've been researching for my question for a while but answears were unsatisfactory. I'm wondering how to display PSW content on standard output. Other thing, how to display Instruction Pointer value ? I would be very gratefull if ypu could give me a hint (or better a scratch of code). It may be masm or 8086 as well (actually I don't know wthat is the difference :) )

Was it helpful?

Solution

The instruction pointer is not directly accessible on the x86 family, however, it is quite straightforward to retrieve its value - it will never be accurate though. Since a subroutine call places the return address on the stack, you just need to copy it from there and violá! You have the address of the opcode following the call instruction:

proc getInstructionPointer
    push bp
    mov bp,sp

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

    mov sp,bp
    pop bp
    ret
endp getInstructionPointer

The PSW on the x86 is called the Flags register. There are two operations that explicitly reference it: pushf and popf. As you might have guessed, you can simply push the Flags onto the stack and load it to any general purpose register you like:

pushf
pop ax

Displaying these values consists of converting their values to ASCII and writing them onto the screen. There are several ways of doing this - search for "string output assembly", I bet you find the answer.

To dispel a minor confusion: 8086 is the CPU itself, whereas MASM is the assembler. The syntax is assembler-specific; MASM assembly is x86 assembly. TASM assembly is x86 assembly as well, just like NASM assembly. When one says "x86 Assembly", he/she is referencing any of these (or others), talking about the instruction set, not the dialect.

Note that the above examples are 16bit, indtended for 8086 and won't work on 80386+ in 32bit mode

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top