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 : modifier un byte d'adresse segment:offset [ Archives / Newbii ] (TheWhiteShadow)

jeudi 3 juillet 2003 à 16:49:56 | modifier un byte d'adresse segment:offset

TheWhiteShadow

ca fait pas longtemps que j'ai commencé l'asm... et j'aimerai savoir comment on fait pour modifier un octet en mémoire sans pas par DS

j'ai une adresse segment et une offset et j'aimerai pouvoir modifier cette adresse...

Comment faire ?

jeudi 3 juillet 2003 à 17:56:06 | Re : modifier un byte d'adresse segment:offset

prunkdump

Tu peut utilisé l'instructions stosb : cette instrution place le contenu de al à l'adresse es:di dons tu met dans es le segment et dans di l'offset de l'octet à placer. Ainsi tu n'a pas besoin d'utiliser ds ( attention après cette instruction di à augmenté de 1 )



-------------------------------
Réponse au message :
-------------------------------

> ca fait pas longtemps que j'ai commencé l'asm... et j'aimerai savoir comment on fait pour modifier un octet en mémoire sans pas par DS
>
> j'ai une adresse segment et une offset et j'aimerai pouvoir modifier cette adresse...
>
> Comment faire ?

jeudi 3 juillet 2003 à 18:34:38 | Re : modifier un byte d'adresse segment:offset

TheWhiteShadow

y'a juste un petit problème...

j'ai essayé ça :

mov al,2
mov es,0040h
mov di,0017h
stosb

mais il y a une erreur, il dit "non concordance de taille opérande" pour le mov es,0040h
j'ai essayé

mov byte ptr [es],0040h
mov word ptr [es],0040h
mov dword ptr [es],0040h

mais ca marche pas non plus... c'est quoi le problème ?



-------------------------------
Réponse au message :
-------------------------------

> Tu peut utilisé l'instructions stosb : cette instrution place le contenu de al à l'adresse es:di dons tu met dans es le segment et dans di l'offset de l'octet à placer. Ainsi tu n'a pas besoin d'utiliser ds ( attention après cette instruction di à augmenté de 1 )
>
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > ca fait pas longtemps que j'ai commencé l'asm... et j'aimerai savoir comment on fait pour modifier un octet en mémoire sans pas par DS
> >
> > j'ai une adresse segment et une offset et j'aimerai pouvoir modifier cette adresse...
> >
> > Comment faire ?
>

jeudi 3 juillet 2003 à 23:38:28 | Re : modifier un byte d'adresse segment:offset

CoreBreaker

tu ne peux pas affecter une valeur immédiate à un registre de segment il faut passer par un registre de donnée général:

mov ax, le_segment
mov es, ax


A la place d'un registre de donnée général (AX, BX, CX, DX, SI, DI, BP), tu aussi utiliser la mémoire et la pile:
mov [variable], le_segment
mov es, [variable]

ou
push 1234h
pop es


Core Breaker


-------------------------------
Réponse au message :
-------------------------------

> y'a juste un petit problème...
>
> j'ai essayé ça :
>
> mov al,2
> mov es,0040h
> mov di,0017h
> stosb
>
> mais il y a une erreur, il dit "non concordance de taille opérande" pour le mov es,0040h
> j'ai essayé
>
> mov byte ptr [es],0040h
> mov word ptr [es],0040h
> mov dword ptr [es],0040h
>
> mais ca marche pas non plus... c'est quoi le problème ?
>
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Tu peut utilisé l'instructions stosb : cette instrution place le contenu de al à l'adresse es:di dons tu met dans es le segment et dans di l'offset de l'octet à placer. Ainsi tu n'a pas besoin d'utiliser ds ( attention après cette instruction di à augmenté de 1 )
> >
> >
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > > ca fait pas longtemps que j'ai commencé l'asm... et j'aimerai savoir comment on fait pour modifier un octet en mémoire sans pas par DS
> > >
> > > j'ai une adresse segment et une offset et j'aimerai pouvoir modifier cette adresse...
> > >
> > > Comment faire ?
> >
>

jeudi 3 juillet 2003 à 23:40:56 | Re : modifier un byte d'adresse segment:offset

CoreBreaker

L'instruction
mov word ptr [es],0040h

n'existe pas, c'est à la limite:
mov word ptr [es:di],0040h
ou
mov word ptr es:[di],0040h


jeudi 3 juillet 2003 à 23:49:48 | Re : modifier un byte d'adresse segment:offset

TheWhiteShadow

bon voila j'ai esssayé de mettre ça dans mon code delphi

asm
mov al,2
mov ax,0040h
mov es,ax
mov di,0017h
stosb
dec di
end;

compilation nickel, mais il me sort une erreur EAccesViolation à l'execution au moment du stosb. Pourtant je me suis pas trompé l'adresse, j'ai repris une source pascal qui permet de faire clignoter les dels du clavier...

var
EtatClavier: byte absolute $0040:$0017;

mais cette ecriture n'est plus possible en delphi

bon voilà je sais toujours pas...



-------------------------------
Réponse au message :
-------------------------------

> tu ne peux pas affecter une valeur immédiate à un registre de segment il faut passer par un registre de donnée général:
>
>
mov ax, le_segment
> mov es, ax
>

>
> A la place d'un registre de donnée général (AX, BX, CX, DX, SI, DI, BP), tu aussi utiliser la mémoire et la pile:
>
mov [variable], le_segment
> mov es, [variable]
>

> ou
>
push 1234h
> pop es
>

>
> Core Breaker
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > y'a juste un petit problème...
> >
> > j'ai essayé ça :
> >
> > mov al,2
> > mov es,0040h
> > mov di,0017h
> > stosb
> >
> > mais il y a une erreur, il dit "non concordance de taille opérande" pour le mov es,0040h
> > j'ai essayé
> >
> > mov byte ptr [es],0040h
> > mov word ptr [es],0040h
> > mov dword ptr [es],0040h
> >
> > mais ca marche pas non plus... c'est quoi le problème ?
> >
> >
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > > Tu peut utilisé l'instructions stosb : cette instrution place le contenu de al à l'adresse es:di dons tu met dans es le segment et dans di l'offset de l'octet à placer. Ainsi tu n'a pas besoin d'utiliser ds ( attention après cette instruction di à augmenté de 1 )
> > >
> > >
> > >
> > > -------------------------------
> > > Réponse au message :
> > > -------------------------------
> > >
> > > > ca fait pas longtemps que j'ai commencé l'asm... et j'aimerai savoir comment on fait pour modifier un octet en mémoire sans pas par DS
> > > >
> > > > j'ai une adresse segment et une offset et j'aimerai pouvoir modifier cette adresse...
> > > >
> > > > Comment faire ?
> > >
> >
>

jeudi 3 juillet 2003 à 23:50:18 | Re : modifier un byte d'adresse segment:offset

CoreBreaker

C'est simple si tu ne veux pas passer par DS il faut passer par un autre registre de segment tu as CS, ES, SS, FS et GS
Mais attention il est dangereux de changer SS c'est le segment de pile et CS c'est le segment de code mais rien t'empêche de faire:
mov ax, cs:[di]
pour lire une valeur dans le segment de code.
Sinon pour modifier il es conseillé d'utiliser ES, FS, ou GS ainsi:
mov ax, l_adresse_de_segment
mov fs, ax
mov byte ptr fs:[adresse_d_offset], une_valeur_d_octet

ou en passant par un registre d'indirection:
mov ax, l_adresse_de_segment
mov fs, ax
mov bx, adresse_d_offset
mov byte ptr fs:[bx], une_valeur_d_octet

Tu peux aussi passer par les instructions de chaines comme stosb:
mov ax, l_adresse_de_segment
mov es, ax ; C'est obligatoirement ES ici
mov di, adresse_d_offset ; C'est obligatoirement DI ici
mov al, une_valeur_d_octet
stosb


Et voilà !

Core Breaker


jeudi 3 juillet 2003 à 23:57:31 | Re : modifier un byte d'adresse segment:offset

CoreBreaker

Sous delphi et donc sous windows le segment 40h est en ring 0 et donc au niveau noyau, c'est interdit d'y accéder pour un programme seuls les VXD et les programmes de type console (prog DOS) ont le droit d'y accéder !

Attention grosse faute de prog:
Après
mov al,2
mov ax,0040h

AX vaut 40h et donc lors du stosb tu mets 40h et pas 02h
Tu dois faire ainsi:
asm
mov ax,0040h
mov es,ax
mov al,2
mov di,0017h
stosb
dec di
end;

Core Breaker


vendredi 4 juillet 2003 à 00:02:24 | Re : modifier un byte d'adresse segment:offset

TheWhiteShadow

ouais j'ai pigé mon erreur mais en gros je pourrais donc jamais y acceder... ok... mais bon j'ai une fonction qui permet d'acceder au sorties/entrées du processeur mais ca on a droit je pense... sinon t'aurai pas une adresse mémoire que je puisse tester et recupérer les donnés pour voir si ça marche bien ??



-------------------------------
Réponse au message :
-------------------------------

> Sous delphi et donc sous windows le segment 40h est en ring 0 et donc au niveau noyau, c'est interdit d'y accéder pour un programme seuls les VXD et les programmes de type console (prog DOS) ont le droit d'y accéder !
>
> Attention grosse faute de prog:
> Après
>
mov al,2
> mov ax,0040h
>

> AX vaut 40h et donc lors du stosb tu mets 40h et pas 02h
> Tu dois faire ainsi:
> asm
> mov ax,0040h
> mov es,ax
> mov al,2
> mov di,0017h
> stosb
> dec di
> end;
>
> Core Breaker
>
>

vendredi 4 juillet 2003 à 15:32:23 | Re : modifier un byte d'adresse segment:offset

CoreBreaker

Ca peut marcher ce que tu fais (écrire dans le segment 40). Je sais plus comment on fais avec Delphi ou même si c'est possible mais il faut faire une appli qui s'exécute exclusivement dans une fenêtre DOS (command.com). Ca s'appelle une appli console.

Pour le port 60h tu peux mais attention je ne sais pas pour tou les autres port car certains peuvent être virtualisé pour éviter d'être en conflit avec des drivers et windows peut t'interdire l'accès.

Pour tester tu peux tout de même passer par une allocation de mémoire virtuelle avec l'API windows VirtualAlloc. Ensuite du prends le pointeur donné par VirtualAlloc et tu fais ceci:

asm
push ds
pop es
mov edi, le_pointeur
mov al, 2
stosb
end;


Attention le pointeur est sur 32bits est c'est un offset

Core Breaker


-------------------------------
Réponse au message :
-------------------------------

> ouais j'ai pigé mon erreur mais en gros je pourrais donc jamais y acceder... ok... mais bon j'ai une fonction qui permet d'acceder au sorties/entrées du processeur mais ca on a droit je pense... sinon t'aurai pas une adresse mémoire que je puisse tester et recupérer les donnés pour voir si ça marche bien ??
>
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Sous delphi et donc sous windows le segment 40h est en ring 0 et donc au niveau noyau, c'est interdit d'y accéder pour un programme seuls les VXD et les programmes de type console (prog DOS) ont le droit d'y accéder !
> >
> > Attention grosse faute de prog:
> > Après
> >
mov al,2
> > mov ax,0040h
> >

> > AX vaut 40h et donc lors du stosb tu mets 40h et pas 02h
> > Tu dois faire ainsi:
> > asm
> > mov ax,0040h
> > mov es,ax
> > mov al,2
> > mov di,0017h
> > stosb
> > dec di
> > end;
> >
> > Core Breaker
> >
> >
>



Cette discussion est classé dans : modifier, adresse, byte, offset, segment


Répondre à ce message

Sujets en rapport avec ce message

une librairie [ par rhumsek ] slt mon prog contient une erreur d'après ma compilationje ne la voie pas pouvez vous m'aidé??TITLE Test de la librairieINCLUDE Irvine32.libCR=0DhLF=0A adresse de base d'un segment [ par gblade ] voila si qqun pouvait me dire comment on fait pour définit l'adresse de base d'un segment. j'ai vu dans certaines docs ils mettent une equate au début problem dans le segment .data (NASM) [ par bouba ] J'ai commencé aujourd'hui la programmation en AssembleurMon premier programme est classique, le "Hello world!".J'utilise NASM sous Linux (Red Hat 7.3, Problème d'adresse effective [ par Ihlianov ] Hi,J'ai un problème avec NASM, qui me rend cinglé.Je code un .Com (16 bits) et il me revoit une erreur sur l'instruction suivante : mov ax, [d help syntaxe [ par Evonay ] pouvez vous me dire ou est le probleme de syntaxe dans:movzx edx,byte ptr [offset _AddTable+edx+ebx]avecvar _AddTable: array[0..256*2-1] of Byte; Debugger! [ par keos31 ] est-ce que quelqun sait se servir de td32.exe le debugger livre avec c++?je voudrais savoir comment: -on regarde le contenu d'une certaine adresse SVP les amis - Comment convertire une adresse IP (100.100.100.100) en Hex(7) sour Win2000 [ par 31057700 ] SVP les amis - Comment convertire une adresse IP (100.100.100.100) en valeur Hex(7) sous Win2000 afin que la valeur soit intégré dans la base de regi Simple addition [ par nostra ] Big totoJe n'arrive pas à afficher les valeurs A (=3) et B(=2) ainsi que le résultat de l'addition. Merci de trouver le ou les erreurs commises.;----- Addition pourtant simple [ par nostra ] Big totoJe n'arrive pas à afficher le résultat de l'addition malgré les remarques de Nemesis. Merci de trouver le ou les erreurs commises. ;---------- débutant qui a un prob avec l'int21h [ par sibi12 ] salut voivi mon code : mov ah, 09h mov dx, offset buffer int 21hbuffer a été déclaré comme ca: buffer db 50 dup(0)le compilateur me met


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

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,593 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é.