Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Récupération des flags du processeur [ Divers / Débutant(e) ] (Oeil_de_taupe)

lundi 18 septembre 2006 à 21:02:29 | Récupération des flags du processeur

Oeil_de_taupe

Bonjour,

J'ai essayé, après avoir lu beaucoup de théorie sur l'assembleur sur X86, de faire un programme qui utilise les flags d'information du processeur. Ce que j'ai voulu testé est le flag OF (overflow). J'ai donc fais un petit programme qui fait un overflow avec ce code :

mov al, 0xFF
add al, 0x01

Puis j'ai récupéré les flags du processeurs (c'est la seule façon que j'ai trouvée) et j'ai isolé le 12 ème bit (celui de OF).

pushf
pop bx

%define pow2(a) 1 << a
%define OF 11
and bx, pow2(OF)


Le contenu de BX devrait donc donné l'état de OF (si OF=1, BX>0 et si OF=1 BX>0) mais la valeur de BX égale constamment 0.
Je ne sais pas si qqun aurait un exemple de code qui isole un flag en particulier afin que je puisse chercher le problème dans mon code.


Merci d'avance.


PS: J'ai testé avec des flags comme CF et avec eux ça marche!

mardi 19 septembre 2006 à 00:43:37 | Re : Récupération des flags du processeur

Oeil_de_taupe

Je viens de constater que mon livre sur l'assembleur est légèrement incomplet puisqu'il omet de présenter les instructions jc/jnc/jo/jno etc...

J'ai donc testé avec ces instructions plutôt que d'extraire le registre de flags directement, et magie! L'instruction jo (qui saute si il y a un dépassement de capacité) ne saute pas lorsque j'en crée artificiellement un dans le programme! Par contre jc/jnc fonctionnent.


Ceci fait que, finallement, ma technique pour accéder aux flags marchait. C'est tous simplement les instructions :  "mov al, 0xFF" puis "add al, 0x01" qui ne font pas de overflow.
Une autre possibilité est que le flag de dépassement de capacité n'est pas activé en 16 bit (je fais des fichiers COM), mais j'ai beau fouiller le web je trouve personne qui affirme ceci...





mardi 19 septembre 2006 à 08:22:31 | Re : Récupération des flags du processeur

Nasman

Réponse acceptée !

Bonjour Oeil_de_taupe,

Sauf erreur de ma part, je crois que tu confonds l'overflow et la retenue.

La retenue apparait lorsqu'un registre présente une valeur plus faible (en apparence) après une addition d'un nombre positif. Dans ton cas on a:

0xFF + 0x01 = retenue (C) + 0x00  = 0x100 + 0x00

L'overflow apparait lorsque l'addition de deux nombres positifs donne un nombre négatif. Par exemple:
0x7F (+127) + 0x01 = 0x80 (-128).

Rappel: en binaire signé on a:

positif si compris entre 0x00 et 0x7F (0 à +127)

négatif si compris entre 0x80 et 0xFF (-128 à -1)

A+


mardi 19 septembre 2006 à 21:28:45 | Re : Récupération des flags du processeur

Oeil_de_taupe

Merci beaucoup Nasman !

Grâce à toi j'ai enfin compris la différence entre le carry flag (flag de retenue) et l'overflow. Et si je ne me trompe pas l'arithmétique signée n'a pas d'instruction spéciale, ce sont les instructions add et sub qui font l'affaire (pour la division et la multiplication il y a idiv et imul).


Je profite juste du faite que ton pseudo soit NASMAN pour te poser une question sur l'opérande de concaténation dans NASM : "%+". Chez moi NASM m'affiche une erreur lorsque je veux l'utiliser.
Par exemple avec un code comme ceci (donné en exemple dans le manuel de NASM) :

%define BDASTART 400h                ; Start of BIOS data area
struc   tBIOSDA                      ; its structure 
.COM1addr RESW 1
.COM2addr RESW 1
; ..and so on
endstruc
%define BDA(x) BDASTART + tBIOSDA. %+ x


puis pour utiliser le macro:
mov     ax,BDA(COM1addr) 

mais chez moi NASM lève une erreur de ce type:

main.asm:16: symbol `tBIOSDA.' undefined





mardi 19 septembre 2006 à 22:09:37 | Re : Récupération des flags du processeur

Oeil_de_taupe

Je tiens à le signaler. L'erreur précédente vient du faite que j'utilisais une vieille version de NASM ! En pernant la dernière version sur le site je peux maintenant utiliser cette fonctionalité sans problème. Et merci encore à Nasman pour m'avoir dépanné.



Cette discussion est classé dans : code, bx, of, processeur, flags


Répondre à ce message

Sujets en rapport avec ce message

rs232 [ par TRAX44 ] salut,tout premièrement je sais qu'il ya des exemples sur le site!mais mon problème est autre je tiens à comprendre pourquoi mon code ne fonctionne pa Modifer le vecteur d'interruptions [ par vecchio56 ] Bonjour J'essaie de refaire la source http://www.cppfrance.com/code.aspx?ID=33558 en assembleur (ca consiste à modifier la routine de l'interruption 0 Multiplication signée [ par WiebeN ] Bonjour,Je commence tout juste l'assembleur en cours. Je programme avec EMU8086 (émulateur pour processeur 8086) via Windows XP.Mon problème est le su c/c++ et 19h [ par Xs ] salut !je travaille sous VC++ et j'aimerais utiliser une interuption processeur : 19hmon code actuel marche mais au lieu d'eteindre le PC, il le fait Code manchine / myown exe [ par 6Po ] CoucouQqun sais ou je peux trouve de la doc pour cree soit meme un exe ?Cree son propre compilateur en gros. Mici 6Pohttp://www.dreamersteam.org interruption du bios et du dos sous windows [ par eedy31 ] eedy31Salut a tous est ce que quelqu'un pourait m'aider car je ne sais pascomment faire pour utiliser les interruption du dos et du bios sous windows! Fichier resource... [ par Stormy ] Stormy. J'explique le problème. Je dispose de certaines sources en asm sous Masm qui reprennent le principe du fichier resource (rsc) en accompagnemen Rs232 et pic16f84 [ par bwoufy82 ] Voila je recherche un code source en C (qui sera ensuite mis dans le pic16f84)qui a pour but de recupere un caractere au pic, envoyé par mon soft ecri Modes video [ par comax ] Voilà, je voulais savoir comment on faisait pour changez de mode video. Mais pas les mode video du style VGA 320*200 et 256 couleur ! Moi je veux des Mov mem immediat, immediat [ par Erkson ] Bonjour à tous.J'utilise un Pentium II PC, Windows ME, et un debuggeur qui a un assembleur intégré. Lorsque je veux modifier le programme que je debug


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,172 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.