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 Est ce que ça peut être un bout de programme ? [ par Flachy Joe ] Bonjour,Je n'y connais rien en assembleur, je cherche juste à savoir si ce code est exécutable.Ce code a été obtenu en désassemblant des fichiers, est traduire un code .asm [ par wa7ch3000 ] Bonjour, SVP est ce que vous pouvez m'aiderb; je veut faire un interpreteur qui traduit un code assembleur en langage machine  < Passer d'un code asm à un code c ? [ par Octocat ] Bonjour à tous, je suis nouveau dans le langage assembleur et j'avoue avoir quelques soucis...Mon professeur me demande d'interprétrer un code assembl diffrerence entre (e)ax et ax , (e)bx et bx, ... [ par dyroj ] bonjour a tous,je suis en periode d'aprentissage du language assembleur et j'ai une petite quetion consernant le e (extented) devant le nom d'un regis code.hex vers code.asm [ par aartisste ] Bonjour,J'ai l'executable d'un code assembleur (PIC18F) écrit avec mplab 8 j'ai perdu le code source comment(soit avec mon programmateur ICprog(SEEIT) assemblage des instruction [ par yacine000 ] il y a quelqun qui sait résourdre ceexercicel'assemblage des instruction suivantesMOV AX, 200MOV BX , AXMOV SI,BXMOV(SI),BXMOV(0200),BX               


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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,421 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é.