2013-01-18 4 views
0

Je suis débutant avec asm, donc j'ai fait des recherches pour ma question pendant un moment, mais les réponses étaient insatisfaisantes. Je me demande comment afficher le contenu PSW sur la sortie standard. Autre chose, comment afficher la valeur Instruction Pointer? Je serais très reconnaissant si ypu pourrait me donner un indice (ou mieux une égratignure de code). Il peut être masm ou 8086 aussi (en fait je ne sais pas quelle est la différence :))Afficher le contenu PSW

Répondre

0

Le pointeur d'instruction n'est pas directement accessible sur la famille x86, cependant, il est assez simple de récupérer sa valeur - il ne sera jamais précis cependant. Puisqu'un appel de sous-programme place l'adresse de retour sur la pile, il vous suffit de la copier à partir de là et de violer! Vous avez l'adresse de l'opcode suivant les instructions call:

proc getInstructionPointer 
    push bp 
    mov bp,sp 

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

    mov sp,bp 
    pop bp 
    ret 
endp getInstructionPointer 

Le PSW sur le x86 est appelé le registre de drapeaux. Deux opérations le référencent explicitement: pushf et popf. Comme vous l'aurez deviné, vous pouvez simplement pousser les drapeaux sur la pile et le charger à des fins générales de votre inscription aimez:

pushf 
pop ax 

L'affichage de ces valeurs consiste à convertir leurs valeurs en ASCII et de les écrire sur l'écran. Il y a plusieurs façons de le faire - recherche de "chaîne de sortie", je parie que vous trouvez la réponse.

Pour dissiper une confusion mineure: 8086 est le processeur lui-même, alors que MASM est l'assembleur. La syntaxe est spécifique à l'assembleur; L'assemblage MASM est un assemblage x86. L'assemblage TASM est également un assemblage x86, tout comme l'assemblage NASM. Quand on dit "Assemblage x86", il fait référence à l'un d'entre eux (ou à d'autres), en parlant du jeu d'instructions, pas du dialecte.

Notez que les exemples ci-dessus sont 16bit, indtended pour 8086 et ne fonctionnera pas sur 80386+ en mode 32bit