Dump memoire : indications

Signaler
Messages postés
5
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
29 avril 2003
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
comment fait-on pour lire le segment lors d'un deump memoire en intel ?

eventuellement balancez les sources, on se debrouillera avec...

merci d'avance, amis porgrammeurs (confirmés, à l'inverse de moi)

13 réponses

Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
dump à l'écran ou dans un fichier ?
Veux-tu dumper tout un segment (64Ko) ?

Core Breaker :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Lire le segement ???
La valeur d'un registre de segment ?
Lors d'un dump ??

Peux tu donner un exemple de ce que tu veux STP ? Voire expliquer plus

Core Breaker :)
Messages postés
5
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
29 avril 2003

Le dump se fait à l'écran tout comme un éditeur hexadécimal (exactement pareil au niveau de la présentation)
voilà :)
Messages postés
59
Date d'inscription
dimanche 15 décembre 2002
Statut
Membre
Dernière intervention
2 juin 2004

Tu veux donc faire un dump comme Debug ??
Ceux que tu as besoins, c donc le code qui permet de convertir une valeur numérique en chaine ascii ??

%-6 TangiX %-6
Messages postés
5
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
29 avril 2003

Oui entre autre mais aussi le code pour accéder à la mémoire pour organiser enfin tout ça sous forme de tableau
en fait c'est une fenêtre exactement pareille que celle de debug mais sous dos (comme un éditeur hexa)
Messages postés
59
Date d'inscription
dimanche 15 décembre 2002
Statut
Membre
Dernière intervention
2 juin 2004

Pour faire un beau tableau, tu dois faire des bonne boucle
Pour charger une valeur de la mémoire, utilise l'instruction LODSB (DS;SI->AL,SI+1->SI)
Pour effectuer la conversion essaye le code suivant (je l'ai pas tester mais le principe est bon) :

 Mov BX, 3030h
Debut:
 Cmp AL,10h
 Jb Suite
 Sub AL,10h
 Inc BH
 Cmp BH,3Ah
 Jne Debut
 Mov BH,'A'
 Jmp Debut

Suite
 Cmp AL,1
 Jb Fin
 Dec AL
 Inc BL
 Cmp BL,3Ah
 Jne Suite
 Mov BL,'A'
 Jmp Suite

Fin:

La chaine se trouve dans BX mais ca peut etre changer
bonne prog

%-6 TangiX %-6
Messages postés
5
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
29 avril 2003

Pourrais tu m'expliquer ces lignes, stp ?
En gros, je voudrais savoir comment on recupere le segment, est-ce qu'on le met dans un tableau qu'on declare avant ?

> Pour faire un beau tableau, tu dois faire des bonne boucle
> Pour charger une valeur de la mémoire, utilise l'instruction LODSB (DS;SI->AL,SI+1->SI)
Messages postés
59
Date d'inscription
dimanche 15 décembre 2002
Statut
Membre
Dernière intervention
2 juin 2004

en gros il te faut deux boucle équivalente à un 'for-next' en vb : la premiére forme ton paragraphe en fonction du nombre de ligne
la deuxième forme une ligne en fonction du nombre de valeur
tu place ton code permettant d'afficher une valeur dans la deuxième boucle
tu place ta deuxième boucle dans la première avec le retour à la ligne
et voila... (c un peu brouillon :clown) )

tu n'as pas besoin de transferrer ton segment ailleurs puisqu'il est déja en mémoire :) l'instruction LODSB te permet de récupérer les octets un par un en mettant le segment dans DS et l'indexdans SI (en plus SI s'incrémente tous seul). L'octet lu est placé dans AL, il ne reste plus qu'a l'exploité

%-6 TangiX %-6
Messages postés
5
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
29 avril 2003

Et LODSB, c'est quoi la syntaxe, si on considère par exemple que j'ai la valeur du segment dans ax ?
Messages postés
59
Date d'inscription
dimanche 15 décembre 2002
Statut
Membre
Dernière intervention
2 juin 2004

push AX
pop DS
xor SI,SI
mov CX,n
boucle:
lodsb
;exploitation de AL
loop boucle

ce code lit les n premiers élement du segment pointé par AX:0

%-6 TangiX %-6
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
.model tiny
.386
le_segment_a_dumper equ 0000h
.code
org 100h
start:
push cs
push cs
pop es
pop ds
jmp debut

tab db "0123456789ABCDEF"
conv db "00 00 00 00 00 00 00 00 "
db "00 00 00 00 00 00 00 00 "
asc db "................"
db 13, 10, '$'
blank db "00 00 00 00 00 00 00 00 "
db "00 00 00 00 00 00 00 00 "
db "................"

debut:
cld
push ds
pop es
mov ax, le_segment_a_dumper
mov ds, ax
mov di, offset conv
xor si, si
mov bx, offset tab
mov cx, 16384 ; 65536 / 4

principale:
lodsd
mov edx, eax

push ds
push cx

push es
pop ds

mov ax, 16384
sub ax, cx
push ax
and ax, 03h
shl ax, 2
mov cx, 4

boucle_conv:
push ax
push di
mov di, 4
sub di, cx
add di, ax
add di, offset asc

mov al, dl

cmp al, ' '
jb translate

cmp al, 128
jae translate

cmp al, '$'
je translate

stosb

translate:
pop di
shr al, 4
xlat
stosb

mov al, dl
and al, 0Fh
xlat
stosb
shr edx, 8
inc di
pop ax
loop boucle_conv

pop ax
inc ax
test ax, 3
jnz suivant

mov di, offset conv
push dx
mov ah, 9
mov dx, di
int 21h
pop dx

pusha
mov si, offset blank
mov cx, debut - blank
rep movsb
popa

suivant:
pop cx
pop ds
loop principale

mov ax, 4C00h
int 21h

end start


Core Breaker :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Il y mieux pour convertir un digit hexa:

tab db "0123456789ABCDEF"

mov al, valeur
mov bx, offset tab
xlat


valeur est un digit hexa (entre 0 et 15)
à la suite de ça AL contient le digit hexa conerti (de '0' à 'F')
En plus c'est direct comme conversion (en une instruction !!)

Core Breaker :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
lodsb équivaut à:

si DF=1 (mis par l'instruction std)
mov al, ds:[si]
dec si


si DF=0 (mis par l'instruction cld)
mov al, ds:[si]
inc si


Core Breaker :)