Mov mem immediat, immediat

Erkson Messages postés 3 Date d'inscription samedi 15 mars 2003 Statut Membre Dernière intervention 31 mars 2003 - 15 mars 2003 à 09:45
Erkson Messages postés 3 Date d'inscription samedi 15 mars 2003 Statut Membre Dernière intervention 31 mars 2003 - 31 mars 2003 à 20:26
Bonjour à tous.

J'utilise un Pentium II PC, Windows ME, et un debuggeur qui a un assembleur intégré. Lorsque je veux modifier le programme que je debuggue, je tape dans cet assembleur, par exemple :

mov dword ptr [00445120], 90 90 90 90

Lorsque j'exécute cette ligne, le débuggueur remplace le dword en 445120 qui contenait XX XX XX XX par 90 90 90 90.
Autrement dit : [00445120] ne signifie pas : "l'adresse contenue à l'adresse 445120", mais bien : cette adresse 4455120 elle-même.
D'ailleurs le code fabriqué par cet assembleur intégré est bien :
C7 05 20 51 44 00 90 90 90 90

Mais lorsque je veux obtenir le même code en tapant un source pour TASM, par exemple, ou MASM, ces assembleurs lisent bien ma ligne
mov dword ptr [00445120], 90909090
mais refusent de me fabriquer :
C7 05 20 51 44 00 90 90 90 90
en me disant -ce qui ne me surprend pas- 'illegal immediate'.

Je dois alors écrire :
mov eax, 445120h
mov dword ptr [eax], 90909090
pour obtenir mon résultat. Mais cela ne me satisfait pas car le code prend plus d'octets.
Mettre :
.data
mem dd 4455120h
ne me convient pas davantage, pour la même raison.

Ma question est :
pourquoi le debuggueur fabrique-t-il, lui, le bon code ?
que dois-je écrire pour obtenir ce même résultat (i.e C7 05 20 51 44 00 90 90 90 90) avec TASM ou MASM ?

TIA
Erkson

4 réponses

filter Messages postés 42 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 16 mai 2003
15 mars 2003 à 10:46
> J'utilise un Pentium II PC, Windows ME, et un debuggeur qui
>>a un assembleur intégré. Lorsque je veux modifier le
>>programme que je debuggue, je tape dans cet assembleur,
>>par exemple :
>> mov dword ptr [00445120], 90 90 90 90
Tres probablement il ne s'agit pas d'un assembleur integrer. Tt simplement un editeur hexa avec un syntax "pseudo" assembleur.

<snif></snif>

>> Je dois alors écrire :
>> mov eax, 445120h
>> mov dword ptr [eax], 90909090
>> pour obtenir mon résultat. Mais cela ne me satisfait pas car le code prend plus d'octets.

Je ne vois pas ton problem. A condition que tu fais un re-assemblage du programme cela ne pose aucun problem(vu que c le bon facon de faire). Et l'idee que 2 octets de plus sont un probleme est ridicule.

> Mettre :
> .data
> mem dd 4455120h
> ne me convient pas davantage, pour la même raison.

>
> Ma question est :
> pourquoi le debuggueur fabrique-t-il, lui, le bon code ?
> que dois-je écrire pour obtenir ce même résultat (i.e C7 05 20 51 44 00 90 90 90 90) avec TASM ou MASM ?.

Parce qu'il ne s'agit pas d'un assembleur integrer.
0
Erkson Messages postés 3 Date d'inscription samedi 15 mars 2003 Statut Membre Dernière intervention 31 mars 2003
15 mars 2003 à 19:40
Bonsoir, Filter, et merci de ta réponse.

J'ai reçu de alt.lang.asm une réponse qui a réglé le problème.

Dans le source pour TASM ou MASM il fallait écrire :

mov [ds:445120h], 90909090h

Indiquer le data segment "ds:" est indispensable.

L'assembleur du débuggueur s'en passe car il sait dans quel segment se trouvent les datas.

Le source :
MODEL Tiny
.data
.code
.386
org 100h
Start:
mov dword ptr [445120h], 90909090h
END start

ne marche pas.

Celui-ci marche :

MODEL Tiny
.data
.code
.386
org 100h
Start:
mov dword ptr [ds:445120h], 90909090h
END start

En ce qui concerne le sens de [445120] tu as parfaitement raison.
J'avais gardé le souvenir que l'on ne pouvait pas écrire directement une valeur immédiate dans une adresse mémoire. Je pensais qu'il fallait passer par un registre ou par un adressage indirect : copie eax dans 445120h, ou bien met 90909090h dans la mémoire dont l'adresse se trouve en 445120h, mais pas : copie 90909090h dans 445120h.

Le fait que la compilation était impossible m'avait confirmé dans ce souvenir erroné. J'ignorais alors que la cause du refus de compilation était l'absence de l'indication du data segment.

Voilà toute l'histoire !

Erkson
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
31 mars 2003 à 18:24
c'est normal sous Tasm par défaut assrmble en 16bits. Il génère un préfixe de changement en 32bits. Il faut que tu ecrives:

CODE sgment dword use32
mov dword ptr [00445120], 90909090h
CODE ends

Core Breaker :)
0
Erkson Messages postés 3 Date d'inscription samedi 15 mars 2003 Statut Membre Dernière intervention 31 mars 2003
31 mars 2003 à 20:26
Merci des infos.
Je vais tester cette autre solution.

Erkson
0
Rejoignez-nous