Modifer le vecteur d'interruptions

Résolu
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 31 août 2005 à 15:10
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 - 5 sept. 2005 à 09:39
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

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 sept. 2005 à 10:44
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.

@++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 11:19
Je suis pas sur d'avoir compris... j'écris donc
jmp far es:[oldTimerOffset]
C'est ca?
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 sept. 2005 à 11:46
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 11:57
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 14:21
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
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 sept. 2005 à 14:24
.1
mov ah, 1
int 21h
cmp al,'q'
je .2
cmp al,'Q'
jne .1
.2
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 sept. 2005 à 14:57
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 15:06
Comme tu l'as dit plus haut, c'est de toutes facons pas le genre de programme qu'on utilise sous XP
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 sept. 2005 à 16:26
;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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 16:37
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?
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 sept. 2005 à 16:53
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
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 sept. 2005 à 16:53
.model tiny
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 sept. 2005 à 16:56
TINY, SMALL, COMPACT, MEDIUM, LARGE, HUGE, or FLAT
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 17:33
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?
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 sept. 2005 à 17:50
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.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 18:02
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
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
5 sept. 2005 à 09:39
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
0
Rejoignez-nous