Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4257 connectés 

 


Dernière réponse
Sujet : [ASM] Comment faire un jmp qui modifie en meme temps cs et ip?
bjone a bin vi autant pour moa, je croyais que les regsitres de sélecteur contenait l'indice dans la table de descripteurs...
mais non, apparement, c'est bien l'offset :jap:

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
bjone a bin vi autant pour moa, je croyais que les regsitres de sélecteur contenait l'indice dans la table de descripteurs...
mais non, apparement, c'est bien l'offset :jap:
Ace17 Bon je viens d'essayer jmp far 08h:[1000h]
Illegal Immediate qu'il me dit...
 
D'ailleurs je viens de récupérer un code source sur le net; apparament le gars a eu le meme probleme que moi et il a carrément fait une macro pour les jmp far
Qui revient a la syntaxe :
 
db EAh
dd 1000h
dw 08h
 
Peut etre qu'on peut pas le faire sous Tasm ce jmp....
Bizzare....
 
Ah oui je viens de virer le "codeseg" du début du code source
et de mettre des assume cs:nothing........
Y'a plein d'erreurs partout!!!! Je vais repasser au "codeseg"
Ace17 Ben c'est une bonne question; En fait je me suis habitué a la syntaxe de Tasm. Tu penses que j'aurais vraiment intéret a passer a Nasm?
HelloWorld En relisant un peu ton post ta question est en fait :
comment convertir cette synatxe de NASM :
    jmp dword 0x08:0x1000
en TASM ...
essaie :
    jmp far 08h:[1000h]
car ton
    jmp 08h:1000h
me parrait bizarre ... ;)
moi c'est un loin, je me suis interresse a ca y'a 6 mois
t'as l'air d'avoir de bons sites
le Boso kernel est super !!! :hap:
y'a aussi plein de doc interressante sur le flat real mode, ou comment acceder a toute la RAM en mode protege
ca m'avait permi de bien comprendre tous les mecanisme du mode protege (et de la compatibilite avec le mode reel)
 
ASSUME c'est pour eviter des embrouilles entre les divers segments en mode reel, et fonction des modeles memoires, tu peux avoir des problemes du genre faire un jump dans un endroit inaccessible (avec la valeur de CS actuelle)
mais il me semble que dans le cas d'un jmp far, ou tu precise la valeur de CS, ASSUME ne change rien
comme on change CS (jmp far), le saut est forcement correct
enfin bref je pense pas ke ASSUME ait qq chose a avoir la dedans
 
sinon : pourkoi t'utilises pas NASM ??? :??:
Ace17 Pour ceux qui veulent plus de précisions;
 
http://inferno.cs.univ-paris8.fr/~ [...] ial04.html
bjone bin je pense que qd tu mets un ASSUME CS:_CODE, CS est supposé initialisé au segment _CODE... je pense que si tu ne le fais po, (mais en fait l'assume n'est ptet po problématique dans ton cas), lorsque que tu utilises une étiquette, l'assembleur va te faire un warningue.  
j'ai déjà vu du code, ou y'avait un ASSUME CS:CODE, DS:DATA, et un endroit ou y'avait un truc tordu, le mec faisait un ASSUME DS:NOTHING (je crois).
 
qd à ce que tu dois mettre dans CS pour le sélecteur 1 (offset 8), je suis sûr de rien, mais ça me paraitrait logique tu doives mettre 1 (ça me paraitrait bizarre de pouvoir faire charger un descripteur non aligné par le cpu).
Ace17 Et aussi, peut etre que je me répete  :D ; mais quand l'assembleur va tomber sur une directive assume, qu'est-ce que ca va changer a sa maniere d'interpreter le code source?
Ace17 Le premier descripteur j'ai lu quelque part que il était recommandé de le laisser vide...
De plus le selecteur de descripteur doit contenir l'addresse du selecteur et non pas son index - du moins, c'est ce qu'il me semble...corrigez moi si je dis une connerie hein!  :D
bjone le premier descripteur, c'est un descripteur de donnée ?
bjone pour moa, si tu veux le sélecteur 1 (le deuxième) qui est à l'offset 8 dans la table des descripteurs, il serait plus logique de faire un jmp 1:1000h (en fait le cpu copie tes 8 octets du descripteur correspondant au selecteur, dans des registres internes au cpu, pour pouvoir ensuite tester chaque adresse linéaire dans les bornes du descripteur)
Ace17 up
wpk bon, ca va pas t'avancer des masses pour ton pbm, mais je me rappelle ke y'a qcq tmps, j'avais suivi le dev de v2os  
http://v2os.v2.nl/ (un os 32bits en mode protege entierement ecrit en assembleur) ca peut te donner des idees (notament sur comment faire pour utiliser le bios à partir du mode protegé)
Ace17 Bon j'ai trouvé l'opcode, il faut faire un truc du style
db 0EAh
dd 1000h
dw 0008h
 
ce qui équivaut a jmp 08h:1000h
 
Quand je fais ca je suis en mode protégé déja; il s'agit juste de sauter vers un vrai segment de code et ainsi sortir du secteur de boot. Personne d'autres n'a des précisions sur ASSUME?
bjone l'ASSUME, indique juste à l'assembleur ce que à quel segment/selecteur se référencer... un truc du genre...
(ça ne change pas la génération de code, mais c'est des vérifications)
 
par contre, question :
quand tu essayes d'assembler, là tu est en mode réel ? ou en mode protégé ?
passke l'interprétation des opcodes par le cpu va différer suivant si il est en mode réel/protégé !
 
mais bon j'ai pas mal programmé avec dos4gw/pmodew (avec watcomC), mais j'ai jamais été cherché à refaire un kernel...
(y'a tellement de bricolages à faire pour les passages pm/rm, pour pouvoir utiliser le bios....)
 
et par contre si tu fais un
 
PmEntry DW 08h,1000h
 
 
et un jmp far DWORD PTR[PmEntry]
 
y se passe koi ?
 
ce que je comprends po, c'est ce jmp serait alors en mode réel, mais comment le cpu va basculer en mode protégé en sautant que le descripteur :??: (fo switcher un bit du MSW, mais là je cois po)

 

[edtdd]--Message édité par bjone--[/edtdd]

Ace17 J'ai pas encore la prétention de programmer mon os, mais c'est bien dans le but de créer un mini-kernel que je compte faire ce jmp. A ce moment, l'execution en est au secteur de boot qui vient juste de mettre le pross en mode protégé, il faut alors donner la main au kernel qui lui s'execute en mode protégé. Mais de toutes manieres c'est pas compliqué ce que je veux! C'est juste la syntaxe que je demande!  :hello:  
Et aussi ce que veulent dire les directives assume (concretement)
HelloWorld en mode protege t'es pas cense touche a CS
c'est a l'OS de le faire
je crois pas ke tu puisse le faire ca
en gros tu veux programmer en mode protege comme on programme en mode reel
un programme a son segment de code et il doit se demerde avec
enfin je suis sur de rien
je crois d'ailleur que toucher a CS n'est pas permis a n'importe qui
pourkoi tu crees pas plutot des descripteurs identiques ...enfin, c'est histoire de relancer le topic ;)
Ace17 up up up
Ace17 Bon, je pense que je vais trafiquer pour trouver le bon opcode...
Car quand je fais un assume cs:none il me jette......
A quoi elle sert cette directive exactement en fait? Car jusqu'a présent je me suis contenté de la recopier betement
Ace17 Non, en fait quand on est en mode protégé cs ne représente plus l'addresse du début d'un segment, il pointe sur le début du descripteur d'un segment dans la Global Descriptor Table (GDT).
Et en fait il se trouve que mon segment de code est le deuxieme de la liste, et comme chaque descripteur fait 8 bits...le deuxieme est a l'offset 8
bjone au fait je viens de penser, ptet qu'un ASSUME CS:NONE ou CS:NOTHING est nécessaire pour qu'il ne te jette po....
 
au fait pourquoi 08h:1000h, ça fait l'addrese 1080h ??
c'est un point d'entrée du bios /dos ? :??:
bjone jmp far ??
 
sinon au pire, tu push ton nouvo cs/ip, et tu fais un ret.
mais c'est boeuf.
 
si t'y arrive toujours po, tu peux tricher avec des db en attentant de trouver la bonne synthaxe.
Ace17 Par exemple je veux faire jmp 08h:1000h
Mais l'assembleur me dit "Illegal Immediate"
Pourtant avec NASM on pouvait le faire (j'utilise TASM)

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)