Cómo mezclar lenguaje C y ensamblador
1. Incrustar declaraciones de ensamblado en C
Agregue las declaraciones de ensamblado que se integrarán en #pragma asm y #pragma endasm
Ejemplo:
p >#include lt;reg52.hgt;
void main()
{
P0^1=1;
#pragma asm
Programa de retraso de montaje
#pragma endasm
P0^1=0;
}
2.El programa C llama al ensamblador
(1) Formato de archivo C
Antes de que un programa C llame a la función ensambladora, la función debe declararse con extern
Ejemplo:
#includelt; reg51.hgt;
extern void DLY1s();
void main()
{< / p>
P2=0xff;
DLY1s();
P2=0;
}
(2) Ensamblaje formato de archivo
Utilice NAME para definir el nombre del módulo, PUBLIC se declara como una función pública y RESG es el indicador de inicio de la función de ensamblaje
Ejemplo 1:
;************************************
;Tiempo de retraso 1s
;************************************
NOMBRE DLY1s; define el nombre del módulo
PUBLIC DLY1s; declara como función pública
SEG_DLY1s CÓDIGO DE SEGMENTO; define el segmento en el área de almacenamiento del programa
USANDO 1
RSEG SEG_DLY1s; Posición inicial de la función
;;--------------------------< / p>
DLY1s: SETB RS0
MOV R4, #04H
DLY100: MOV R3, #0FFH
DLY101: MOV R2, #0FFH
DLY102: NOP
NOP
DJNZ R2, DLY102
DJNZ R3, DLY101
DJNZ R4, DLY100
CLR RS0
RET
;;----------------------- - -----------
FIN
Ejemplo 2:
;;*********
***************************
;Tiempo de retraso 10 ms
;;*** *********************************
NOMBRE DLY10ms
PÚBLICO DLY10ms
SEG_DLY10ms CÓDIGO DE SEGMENTO
USANDO 1
RSEG SEG_DLY10ms
;;------------ ---------------
DLY10ms: SETB RS0
MOV R3, #32H
DLY101: MOV R2, # 31H
DLY102: NOP
NOP
DJNZ R2, DLY102
DJNZ R3, DLY101
CLR RS0
RET
;;-------------------------------- - --
FIN
3. Función C de llamada de ensamblaje
(1) Formato de archivo de ensamblaje
CÓDIGO EXTRN (función); Función de declaración C que se llamará
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV 30H, #5
MOV 31H, #6
Función CALL; llamar a función C
MOV P2, 32H
FIN
(2 ) Formato de archivo C
#include lt; reg51.hgt;
#include lt.hgt
función nula()
<; p > {DBYTE[0x32]=DBYTE[0x30] DBYTE[0x31];
}
Nota: Este método es simple y fácil de dominar. pero tiene almacenamiento La desventaja del uso ineficiente del espacio es que este método es una buena opción cuando el proyecto tiene pocos requisitos de espacio de almacenamiento.
4 Llamadas mixtas que pasan parámetros a través de registros
Las llamadas entre sí deben cumplir las reglas anteriores para el ensamblaje de clave C y las llamadas de clave C de ensamblaje
Ejemplo 1 Ensamblaje de llamada C:
Archivo C:
#include lt; reg51.hgt
unsigned int ADD1(unsigned int a, unsigned int b)
void main()
{
unsigned int c
c=ADD1(100, 100);
}
Archivo de ensamblaje:
NOMBRE _ADD1
PÚBLICO _ADD1
SEG_ADD1 CÓDIGO DE SEGMENTO
USO 1
RSEG SEG_ADD1
_ADD1:
MOV A, R5
AÑADIR A, R7
MOV R7 , A p>
MOV A, R4
ADDC A, R6
MOV R6, A
RET
FIN
Nota: Al definir una función en ensamblador al pasar parámetros a través de registros, debe usar "_nombre de función" para definir la función
Ejemplo 2 Llamada a ensamblador C:
Archivo de ensamblaje:
EXTRN CODE(_function); declara la función C que se llamará. Si se utiliza el registro, la función es _function
ORG 0000H
.LJMP MAIN
ORG 0030H
MAIN: MOV R7, #5; Coloque el valor a transferir a la unidad de registro de respuesta
MOV R5, #6
CALL _function
MOV A, R7
END
Archivo C:
#include lt ; reg51.hgt;
función de carácter sin firmar (carácter sin firmar a, carácter sin firmar b)
{
return(a b);
}