Vous êtes sur la page 1sur 8

Interfaçage assembleur-langage ‘C’

Directives USES et arg

near pascal addition PROC NEAR C USES di si, arg1:WORD, arg2:WORD,


arg3:WORD
push bp ;sauvegarde de BP
mov bp, sp ;faire pointer BP sur SP
push di ;sauvegarde de di
push si ;sauvegarde de si
mov si,arg1
mov di,arg2
mov ax,arg3
add ax,di
add ax,si
pop si ;récupération de si
pop di ;récupération de di
mov sp, bp ;remettre sp à sa valeur initiale
pop bp ;récupération de bp
ret 6 ;nettoyage de la pile
addition endp

 Appel depuis l’assembleur:

Invoke addition 1,2,3 ; en cas d’addition de 1, 2 et 3

Appel depuis le langage ‘C’:

 Addition(1,2,3);

Microprocesseurs
1
Assembleur et langage ’C’
Appel de procédures ‘C’ depuis l’assembleur

Cas de Printf: int Cdecl printf(const char *__format, ...);

.MODEL small, c ; Model mémoire et conventions d’appel c


.
printf PROTO NEAR, ; prototype de la fonction printf (VARAG:
;arguments variables)
pstring:NEAR PTR BYTE, num1:WORD, num2:VARARG

.DATA

format BYTE '%i %i', 13, 0 ; chaîne de caractères à afficher par printf
.CODE
_main PROC PUBLIC ; Procédure assembleur qui fait appel à
printf
.
INVOKE printf, OFFSET format, ax, bx
.
.
.
_main endp
END _main ; Fin de la procédure

Microprocesseurs
2
Le compilateur Assembleur
 Un petit programme réalisé avec DEBUG :

C:\DOS>debug
-a
24A2 : 0100 ORG 200
24A2 : 0200 DB "Bien le bonjour de la part de DEBUG!$"
24A2 : 0225 ORG 100
24A2 : 0100 MOV AH,09
24A2 : 0102 MOV DX,200
24A2 : 0105 INT 21
24A2 : 0107 MOV AX,4C00
24A2 : 010A INT 21
24A2 : 010C [Return]
-g
 le même programme écrit pour MASM/TASM :

DOSSEG
.MODEL SMALL
.STACK 50
.DATA
LIGNE DB "Bien le bonjour de la part de MASM/TASM!$"
.CODE
MOV AX,@DATA
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET LIGNE
INT 21H
MOV AX,4C00H
INT 21H
END
Microprocesseurs
3
Le compilateur Assembleur
 Déclaration de variables initialisées:

.DATA
octet db -2
octets db 8 dup(0)
chaine db "Bonjour",0
mot dw 7FFFh
doubleMots dd 2 dup(0FFFFFFFFh)
nombre_reel real4 1.0

 Directives de programmation structurée:

.DATA
buf1 BYTE "This is a string",'$‘
buf2 BYTE 100 DUP (?)
.CODE
sub bx, bx ; mise à zero de bx
.WHILE (buf1[bx] != '$')
mov al, buf1[bx] ; Lire un caractère
mov buf2[bx], al ; le placer dans buf2
inc bx ; incrementation de bx
.ENDW

Microprocesseurs
4
Thèmes de programmation variés
Exemples de programmation:

Transfert d’éléments d’un tableau vers un autre


Calcul de la sommation des éléments d’un tableau et affichage du resultat.
Recherche du maximum d’un tableau
Recherche du minimum d’un tableau
Tri par ordre croissant d’un tableau

Remarque: Les procédures (2) et (5) doivent être écrites en langage ‘C’:

extern near pascal int TAB1[];


void pascal TRI (void){
int j,i=0; int aux;
do {
j=i+1;
Procédure (5)
do {
if (TAB1[i]>=TAB1[j])
{aux=TAB1[i]; TAB1[i]=TAB1[j];
TAB1[j]=aux;};
j++; } while(j<=4);
i++;
}while(i<=3);
}

extern near pascal int TAB1[];


int near pascal SOMME (void){
Procédure (2)
int i=0;
int somme =0;
do { somme = somme+TAB1[i]; i++; } while(i<=4) ;
printf("%d",somme);
return(somme);
}

Microprocesseurs
5
Thèmes de programmation variés
.model small
.stack 256
.data
TAB1 dw 3,2,1,5,4
Initialisation
tab2 dw 5 dup(?)
message byte 0ah,0dh,' le resultat est: %d',0
.code
public TAB1
extern SOMME:far ; procédure ‘C’
extern _printf:far ; procédure ‘C’
extern TRI:near ; procédure ‘C’

transfert proc near


mov si,offset tab1
mov di,offset tab2
push ds
pop es Procédure transfert
mov cx,5
rep movsw
ret
transfert endp

minimum proc near


mov si,offset tab1
mov bx,[si]
mov cx,5
boucle: cmp bx,[si]
jl suite
mov bx,[si] Procédure minimum
suite: add si,2
loop boucle
mov ax,bx
ret
minimum endp
Microprocesseurs
6
Thèmes de programmation variés
maximum proc near
mov si,offset tab1
mov bx,[si]
Procédure maximum
mov cx,5
boucle:cmp bx,[si]
jg suite
mov bx,[si]
suite: add si,2
loop boucle
mov ax,bx
ret
maximum endp

_main proc near


mov ax,@data
mov ds,ax
call transfert Programme principal
call minimum
call maximum
call SOMME
push
push ax
ax
push
push ds
ds
mov
mov bx,
bx,offset
offsetmessage
message Appel de printf
push bx
push bx
call _printf
call _printf
call TRI
mov ah,4ch
int 21h
_main endp
end _main

Microprocesseurs
7
Traduction en assembleur de procédures ‘C’

 Procédure SOMME

48E3:1C44 55 PUSH BP
48E3:1C45 8BEC MOV BP,SP
48E3:1C47 83EC02 SUB SP,+02
48E3:1C4A 56 PUSH SI
48E3:1C4B 33F6 XOR SI,SI ; int i=0;
48E3:1C4D C746FE0000 MOV Word Ptr [BP-02],0000 ; int somme =0;
do {48E3:1C52 8BDE MOV BX,SI
48E3:1C54 D1E3 SHL BX,1
48E3:1C56 8B46FE MOV AX,Word Ptr [BP-02]
48E3:1C59 03870000 ADD AX,Word Ptr [BX+0000] ; somme+TAB1[i];
48E3:1C5D 8946FE MOV Word Ptr [BP-02],AX
48E3:1C63 46 INC SI ; i++
48E3:1C64 83FE04 CMP SI,+04 ; while(i<=4) ;
48E3:1C67 7EE9 JLE 1C52

48E3:1C69 FF76FE PUSH Word Ptr [BP-02]


48E3:1C6C 1E PUSH DS
48E3:1C6D B8C400 MOV AX,00C4 Appel de printf
48E3:1C70 50 PUSH AX
48E3:1C71 90 NOP
48E3:1C72 0E PUSH CS
48E3:1C73 E875E8 CALL 04EB

48E3:1C76 83C406 ADD SP,+06


48E3:1C79 8B46FE MOV AX,Word Ptr [BP-02] ; return(somme);
48E3:1C7C EB00 JMP 1C7E
48E3:1C7E 5E POP SI
48E3:1C7F 8BE5 MOV SP,BP
48E3:1C81 5D POP BP
48E3:1C82 CB RETF

Microprocesseurs
8

Vous aimerez peut-être aussi