[ASM] Comment faire un jmp qui modifie en meme temps cs et ip?

Comment faire un jmp qui modifie en meme temps cs et ip? [ASM] - Programmation

Marsh Posté le 05-11-2001 à 19:51:30    

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)

Reply

Marsh Posté le 05-11-2001 à 19:51:30   

Reply

Marsh Posté le 05-11-2001 à 20:03:51    

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.

Reply

Marsh Posté le 05-11-2001 à 20:42:30    

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 ? :??:

Reply

Marsh Posté le 06-11-2001 à 07:30:44    

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

Reply

Marsh Posté le 06-11-2001 à 07:34:55    

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

Reply

Marsh Posté le 06-11-2001 à 10:36:47    

up up up

Reply

Marsh Posté le 06-11-2001 à 11:01:44    

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 ;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-11-2001 à 17:27:24    

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)

Reply

Marsh Posté le 06-11-2001 à 19:05:19    

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]

Reply

Marsh Posté le 06-11-2001 à 19:22:46    

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?

Reply

Marsh Posté le 06-11-2001 à 19:22:46   

Reply

Marsh Posté le 06-11-2001 à 19:54:40    

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é)

Reply

Marsh Posté le 06-11-2001 à 20:43:19    

up

Reply

Marsh Posté le 07-11-2001 à 00:47:55    

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)

Reply

Marsh Posté le 07-11-2001 à 01:00:52    

le premier descripteur, c'est un descripteur de donnée ?

Reply

Marsh Posté le 07-11-2001 à 13:16:43    

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

Reply

Marsh Posté le 07-11-2001 à 13:19:47    

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?

Reply

Marsh Posté le 07-11-2001 à 17:14:03    

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).

Reply

Marsh Posté le 07-11-2001 à 18:20:24    

Pour ceux qui veulent plus de précisions;
 
http://inferno.cs.univ-paris8.fr/~ [...] ial04.html

Reply

Marsh Posté le 07-11-2001 à 19:13:46    

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 ??? :??:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-11-2001 à 19:58:06    

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?

Reply

Marsh Posté le 07-11-2001 à 20:09:04    

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"

Reply

Marsh Posté le 07-11-2001 à 21:36:37    

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:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed