Création d'une lib sous tasm et linkage avec du code tc avec tlink

Signaler
Messages postés
14
Date d'inscription
samedi 24 mars 2007
Statut
Membre
Dernière intervention
12 février 2016
-
Messages postés
14
Date d'inscription
samedi 24 mars 2007
Statut
Membre
Dernière intervention
12 février 2016
-
Bonjour,
Je cherche à créer une librairie statique avec tasm et la lier avec un code écrit avec turbo c. tout ce passe bien (assemblage, compilation et linkage), mais à l'exécution (dans une invite de commande sous WinXP), j'ai un plantage du type 'le programme XXX a utilisé une instruction invalide à l'adresse machin etc...'. Après test sous turbo debugger, le code C appelle bien le code assembleur, qui lors du ret (j'ai aussi essayé avec retf et retn) renvoie vers autre chose que mon code C. Je me demande si je n'ai pas merdouillé un tantinet avec la pile ou le modèle mémoire...
Voici le code C (test.c):
#include <stdio.h>

extern void cdecl testp(void);

int main(void)
{
/*printf("Appel de testp().");*/

testp();

return 0;
}

Le code asm (timer.asm):
TITLE Timer

.model small
.stack 100h

.data


.code

start:

public _testp

_testp proc __CDECL__
push bp
mov bp,sp

mov ax, 03h
int 10h

xor ax, ax
int 16h

pop bp
ret
_testp endp
end

Le batch utilisé pour compiler, etc... (make.bat)
@echo off
set path=c:\tasm\bin;%path%
set path=c:\tc;%path%

c:\tasm\bin\tasm timer.asm /mx
rem /z /zn
if not %errorlevel% ==0 goto :notok

erase timer.lib
c:\tasm\bin\tlib /0 timer +timer, timer

tcc -a -c test

tlink test,test,,timer /s /d

:notok
pause

Si quelqu'un sait ou je me suis planté, merci d'avance pour votre aide. (je cherche en fait à timer un code en mode réel sous dos).-

2 réponses

Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Salut
Ta source c génère une simple procédure qui retourne n'importe où puisqu'elle n'est pas appelée.

Ceci suffit:
{
main ()
...
testp();
....
}
Amicalement
Messages postés
14
Date d'inscription
samedi 24 mars 2007
Statut
Membre
Dernière intervention
12 février 2016

Bonjour,
Je te remercie de ta réponse. J'en ai discuté avec l'un de mes enseignants, Visiblement, le main() de la source C est appelée par le DOS, qui appelle à son tour testp(). Mon enseignant m'a fourni une solution, mais n'ayant plus Internet chez moi pour cause de déménagement, et n'ayant pas les sources sur moi aujourd'hui, je ne peux les poster. je le ferais cependant assez vite, d'autant plus que maintenant çà marche (bien qu'uniquement en modèle large, mais bon...). A très bientôt donc !