Assembleur et langage C sous Linux

cs_lapinfroid Messages postés 8 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 2 mai 2007 - 18 juil. 2006 à 16:21
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 - 19 juil. 2006 à 11:41
Bonjour a tous ,
avant toute chose , je tiens a preciser que j en ai aucune notion d'assembleur
Je pratique plutot le C et le Java
Dans un programme C , je dois appeler certaines fonctions qui sont definies en Assembleur
je travaille sous Kdevelop (Fedora Core 5)
J ai de suite telecharger Nasm pour tenter de creer un .o avec mon fichier .asm
mais il y a beaucoup d'erreurs a la compilation
N'etant pas un virtuose de l'assembleur : je n arrive pas a connaitre "le langage" assembleur utilisé

je vous mets le debut :

**********************************************************************

.model large

.code

; Chaine d'identification du Packet Driver
teststring db 'PKT DRVR'

; Variables

newbuffer dw 0                  ; Flag 'paquet pret dans le buffer'
                                ; Si = 1 : Paquet pret
countera  dw 0                  ; Compteur 'nb paquets recus'
counterb  dw 0                  ; Compteur 'nb paquets bufferises'
countx    dw 0
buffer    db 16384 dup(0)       ; Buffer

; -------------------------------------------------------------------------
;
;    unsigned short packetvector( unsigned char )
;
;      Description : Recherche du vecteur d'interruption du
;                    packet driver
;
;      Entree :      Numero de l'interruption sur laquelle
;                    on fait la recherche
;
;      Retour :      0  Packet driver present a cette interruption
;                    1  Packet driver non trouve a cette interruption
;
;      Mecanisme :   On recherche la chaine 'PKT DRV' situee a partir
;                    de l'adresse + 2 du vecteur d'interruption
;
; ------------------------------------------------------------------------

public _packetvector
_packetvector:
    push bp
    mov bp,sp
    push di
    push si
    push ds
    push es
    mov ah,35h
    mov al,[bp+6]
    int 21h
    mov di,bx
    add di,3
    push cs
    pop ds
    mov si,offset teststring
    mov cx,8
    repe cmpsb
    mov ax,cx

packetvectorreturn:
    pop es
    pop ds
    pop si
    pop di
    pop bp
    retf

packetvectorinvalid:
    mov ax,0007h
    jmp packetvectorreturn

public _usepacketvector
_usepacketvector:
    push bp
    mov bp,sp
    mov al,[bp+6]
    mov bx,offset driverinfoint + 1
    mov [bx],al ;there has to be a better way!
    mov bx,offset accesstypeint + 1
    mov [bx],al ;there has to be a better way!
    mov bx,offset releasetypeint + 1
    mov [bx],al ;there has to be a better way!
    mov bx,offset getaddressint + 1
    mov [bx],al ;there has to be a better way!
    mov bx,offset setrcvmodeint + 1
    mov [bx],al ;there has to be a better way!
    mov bx,offset sendpacketint + 1
    mov [bx],al ;there has to be a better way!
    pop bp
    retf

**********************************************************

Mon probleme est que dans mon programme C je dois faire appel a des fonctions contenues dans ce fichier assembleur
et pour l instant celui ci ne compile pas car il ne les trouve pas
est ce que qq un peut me dire comment linker un fichier assembleur dans Kdevelop
et de quel type est ce fichier assembleur

Dans l'attente
je vous remercie
   
A voir également:

8 réponses

sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
18 juil. 2006 à 21:42
heu je veux pas dire de connerie mais il me semble que la syntaxe "asm inline" n'est pas celle de nasm mais AT&T (a verifier)
mais heu pas sur aussi mais :

newbuffer dw 0                  ; Flag 'paquet pret dans le buffer'
                                ; Si = 1 : Paquet pret
countera  dw 0                  ; Compteur 'nb paquets recus'
counterb  dw 0                  ; Compteur 'nb paquets bufferises'
countx    dw 0
buffer    db 16384 dup(0)       ; Buffer

il faut pas : comme ceci :
newbuffer dw 0                  ; Flag 'paquet pret dans le buffer'
                                ; Si = 1 : Paquet pret
countera:  dw 0                  ; Compteur 'nb paquets recus'
counterb:  dw 0                  ; Compteur 'nb paquets bufferises'
countx:    dw 0
buffer:    db 16384 dup(0)       ; Buffer

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
cs_lapinfroid Messages postés 8 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 2 mai 2007
18 juil. 2006 à 22:26
Et pas d'idee concernant la compilation ? de ce module asm
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
18 juil. 2006 à 22:31
ben en C il faut pas faire :

_ASM{
}
ou un truc du genre ?

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
19 juil. 2006 à 08:55
Bonjour lapinfroid,

La syntaxe du programme assembleur est celle de Masm en raison des directives:
.model large
buffer    db 16384 dup(0)       ; pour Nasm ce serait : buffer  16384 times db 0
mov si,offset teststring              ;pour Nasm ce serait : mov si,teststring  ;pas de offset

Le mode 16 bits est supposé car tous les registres employés sont des registres 16 bits.

D'après mes souvenirs, l'appel à l'interruption dos (int 21h) avec ah=35h permet de fixer (ou de récupérer, je ne sais plus lequel) un vecteur d'interruption dont le numéro est dans al.

A priori pour utiliser ce programme (un driver ?) il te faut le compiler et le linker avec ton programme C.
Je ne connais pas Kdevelop et ne sais pas s'il peut compiler un programme assembleur. Sinon il te faut:
compiler le programme avec Masm
ou
convertir le programme en syntaxe Nasm et compiler.
Les changements à effectuer sont les suivants:
-remplacer les références à une valeur en mettant entre crochets par exemple
mov al,truc  devient mov al,[truc]              (valeur contenue à l'adresse truc)
-supprimer les "offset" et "ptr"
mov al,offset truc   devient mov al,truc      (adresse de truc)

D'autres changements seront sans doute à faire dans les déclarations des sections
pour le code
.code
bits 16;mode 16 bits

pour les données initialisées (qui ont des valeurs définies au lancement du programme)
.data
db 23,17h ;fixe deux octets à 23 (décimal ou hexa)
dw 1234   ;pour un word
db "coucou",13,10,"$" ;pour une chaine

Pour les données non initialisées (valeurs indéfinie au démarrage - reservation d'espace)
.bss
resb 7 ;reserve un emplacement de 7 octets
resw 3;réserve un emplacement pour 3 word (6 octets).

D'autres changements seront encore nécessaires, il faudra voir les messages d'erreur à la compilation.

A+
0

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

Posez votre question
cs_lapinfroid Messages postés 8 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 2 mai 2007
19 juil. 2006 à 09:24
Merci beaucoup pour cette reponse tres claire
mais malheureusement je n y connais rien du tout en Assembleur
n existe t il pas un compilateur Masm sous Linux
ou une sorte de convertisseur Masm vers Nasm
car je galere fortement et le code fait plus de 500 lignes
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
19 juil. 2006 à 10:19
Je ne connais pas suffisamment Masm pour savoir s'il peut fonctionner sous Linux mais j'en doute.
Masm est un programme de Microsoft fait pour travailler avec les systèmes Microsoft (DOS ou Windows). Ton programme assembleur utilise d'ailleurs des interruptions DOS. Je ne connais pas LINUX (à mon grand regret car je n'aime pas être lié à Microsoft), je me demande d'ailleurs si les interruptions DOS sont implantées sur une plate forme Linux.


Si ton programme est un driver, j'ai bien peur que tu doive le réécrire pour fonctionner sous Linux. C'est un travail pas évident car il faut bien connaitre le mode de fonctionnement de l'OS. A mon avis le langage assembleur te paraitra simple par rapport au problème à traiter.
Avant de compiler le programme assembleur on de le convertir en syntaxe Nasm il faudrait savoir s'il aura une chance de fonctionner sur la plate forme Linux.

Pour ce qui est d'exporter des fonctions, Nasm possède la directive Global qui définit le nom de la fonction rendue visible aux autres modules.
Après des directives existent pour permettre de créer des références à exporter (EXPORT) mais je ne sais pas si celà fonctionne en format pour Linux.

Bonne chance


 
0
cs_lapinfroid Messages postés 8 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 2 mai 2007
19 juil. 2006 à 11:26
Est ce que si je compile sous MASM
et que j obtients un .o   je peux m en servir pour mon edition de liens sous linux ?
ou v a t il y avoir des problemes ?
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
19 juil. 2006 à 11:41
Dans le meilleur des cas je pense que tu pourrais compiler (si Masm le permet ?) et faire l'édition de liens et obtenir un exécutable. Mais si les interruptions DOS ne sont pas connues (int 21h), l'appel à cette interruption peut donner n'importe quoi et un plantage à l'exécution est plus que probable.
0
Rejoignez-nous