begin process at 2010 03 19 15:10:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Divers

 > 

Débutant(e)

 > 

Récupération des flags du processeur


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Récupération des flags du processeur

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ée 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 processeur à pile [ par ramzitligue ] salut, je travaille sur un processeur à pile(Forth),j'ai besoin d'un code source(asm)pour le tester.je prefere que le code contient des instructions c Création d'une lib sous tasm et linkage avec du code tc avec tlink [ par rdany62 ] Bonjour, Je cherche à créer une librairie statique avec tasm et la lier avec un code écrit avec turbo c. tout ce passe bien (assemblage, compilation e Affichage décroissant et alphabétique de 2 listes(Nom_Prénom et Note) [ par m_didi9 ] [code=autre]Data SEGMENT Mess1 DB 10,13, 'Entrez la liste des Noms :' DB 10, 13, '$' Mess2 DB 'Entrez la liste des Notes :' DB 10, 13, '$' Mess3 lecture de date au clavier asm [ par w120 ] salut!! je suis un déééééééébutant en langage assembleur j'ai essayé de le comprendre seul mais au niveau de l'application je trouve tant de diffucul programme assembleur [ par marwen09 ] je veux ecrire un programme assembleur qui recuper la date de system puis affecte dans jour le nombre de jour ,dans anne le nobre d'anne et dans moi s un code en assembleur [ par tatouna ] salut à tous, je suis débutante en asm donc j'ai un problème et je souhaite que vous m'aidiez j'ai une chaine de caractère (une date) et je veut la p


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales