Red de conocimiento informático - Material del sitio web - Cómo mezclar lenguaje C y ensamblador

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

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);

}