Modifer le vecteur d'interruptions [Résolu]

Signaler
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
-
Bonjour
J'essaie de refaire la source http://www.cppfrance.com/code.aspx?ID=33558 en assembleur (ca consiste à modifier la routine de l'interruption 08h). Le problème est que programme se termine aussitôt après avoir été lancé.
Voici mon code:

.model small
.stack

.data
oldTimerSegment DW ?
oldTimerOffset DW ?

.code

; place la valeur de ds dans le code pour pouvoir le récupérer
; dans myTimer
DataSegment DW ?

myTimer:
push ax bx dx

mov ah, 2
mov dl, '.'
int 21h

mov ax, DataSegment
mov es, ax
mov ax, es:oldTimerSegment
mov bx, es:oldTimerOffset

mov es, ax
call es:[bx]
pop dx bx ax
iret

main:
mov ax, @data
mov ds, ax
mov DataSegment, ax

; Modification du vecteur d'interruptions
xor ax, ax
mov es, ax
mov bx, 20h ; 8*4=20h

; premier mot: offset de la procédure
mov ax, es:[bx]
mov oldTimerOffset, ax
mov ax, offset myTimer
mov es:[bx], ax

; deuxième mot: valeur de segment de code
mov dx, es:[bx+2]
mov oldTimerSegment, dx
mov ax, cs
mov es:[bx+2], ax

; attend l'appui d'un touche
mov ah, 1
int 21h

mov ah, 4Ch
int 21h

end main

37 réponses

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
jmp seg:[address] fait un jmp de la valeur near contenue dans seg:[address]
jmp far seg:[address] fait un jmp de la valeur far (seg:offset) contenue dans seg:[address]

en c, tu déclare:
void* address = pFunc;
jmp [address] ira vers pFunc et pas vers address.

@++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Je suis pas sur d'avoir compris... j'écris donc
jmp far es:[oldTimerOffset]
C'est ca?
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
faut inverser les 2 sinon c pas dans le bon ordre:
oldTimerOffset DW ?
oldTimerSegment DW ?

puis:
jmp far [oldTimerOffset] pas besoin de ES car DS ok
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Donc quand on fait jmp far, il prend en opérande l'offset et le segment d'un coup?
Merci pour ta patience, mais ca ne marche toujours pas, je vais abandonner je pense
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Génial, ca marche nickel avec nasm, je vais essayer d'adapter pour mon assembleur
Merci beaucoup pour ton aide

Dans ton code, je trouve juste bizarre le
cmp al,'q'
je .1
c'est sans doute un jne que tu voulais mettre
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
.1
mov ah, 1
int 21h
cmp al,'q'
je .2
cmp al,'Q'
jne .1
.2
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
meme comme cela, le XP me ferme le programme au bout d'un moment ???
l'emulateur a peut etre quelques bugs

.1
mov ah, 1
int 21h
mov dl,al
mov ah,2
int 21h
jmp .1
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Comme tu l'as dit plus haut, c'est de toutes facons pas le genre de programme qu'on utilise sous XP
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
;Apparement les appels BIOS sont plus fiables:
[BITS 16]
[ORG 0x100]


main: ; cs ds es = ss
mov ax,3508h ; recupere le vecteur de l'int 8
int 21h
mov dx,es
mov [pfOldTimer],bx
mov [pfOldTimer+2],dx
lea dx,[myTimer]
mov ax,2508h ; remplace le vecteur de l'int 8
int 21h
xor ax,ax
int 16h
mov ah,4Ch
int 21h


pfOldTimer:
dw myTimer
dw 0
compteur:
dw 0


myTimer:
pusha
push ds
push es
mov ax,cs
mov ds,ax
mov es,ax
inc word [compteur]
cmp word [compteur],18
jne .1
mov word [compteur],0
mov ah,0Eh ; teletype output
mov al,'.'
xor bx,bx
int 10h
.1
pushf
push cs
push .ip_
jmp far [pfOldTimer]
.ip_
pop es
pop ds
popa
iret


; nasmw -f bin hookint.asm -o hookint.com
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu utilise -f bin, c'est pour le model flat. C'est pour cette raison que cs=ds=es=ss?
J'essaie de compiler avec tasm, et il ne connait pas .model flat
Tu sais ce qu'il faut mettre?
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
encore mieux, on remet l'ancien vecteur avant de quitter.
main: ; cs ds es = ss
mov ax,3508h
int 21h
mov dx,es
mov [pfOldTimer],bx
mov [pfOldTimer+2],dx
lea dx,[myTimer]
mov ax,2508h
int 21h
xor ax,ax
int 16h
push ds ; remettre l'ancien vecteur en place
mov ax,[pfOldTimer+2]
mov dx,[pfOldTimer]
mov ds,ax
mov ax,2508h
int 21h
pop ds
mov ah,4Ch
int 21h
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
.model tiny
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
TINY, SMALL, COMPACT, MEDIUM, LARGE, HUGE, or FLAT
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Le mien ne prend pas flat c'est pour ca que je demande...
Tu utilise une interruption pour modifier le contenu de la table d'interruption? On peut pas faire comme je faisais au début?
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
le -f est juste pour specifier le format de sortie ( ici bin donc binaire )
le model flat doit correspondre plutot au 32bits.
c'est juste pour sortir un .com DOS et ça correspond au model tiny.
tu peux faire comme tu faisait au depart sans probleme, le model tiny impose qu'au depart du programme cs ds es = ss mais apres t'en fait ce que tu veux de ses segments.

C'est ça qui est bien mais dangereux en asm.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
nasm -hf (aide sur les formats de sortie), me donne

valid output formats for -f are (`*' denotes default):
* bin flat-form binary files (e.g. DOS .COM, .SYS)

Je pensais que ca correspondait au model flat
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
2
A priori c'est la déclaration du type

[SECTION CODE USE32 CLASS=CODE]

ou

[BITS 16]

qui définit si c'est du 16 ou du 32 bit. Nasm choisit le 16 bit par défaut.

[ORG 0x100] précise l'offset où le programme débutera (dans ce cas en 0x100 pour un .com)



La compilation en binaire pur s'effectue avec l'option -fbin de Nasm



Je pense que c'est l'extension en .com qui génère CS=DS=ES=SS à
l'exécution (pour un exe 16 bits DS=ES, CS et SS ont des valeurs
différentes).



Je ne sais pas ce qui se passe si on compile en binaire (-fbin) un programme en 32 bits et on lui met une extension .com