自贡C语言与汇编语言混合编程实战班是一门专门针对想要深入学习计算机底层原理,提高编程能力的学生开设的课程。这门课程的主要目标是帮助学生理解并掌握C语言和汇编语言的基本知识,以及如何将这两种语言进行混合编程。
在课程的学习过程中,学生将会学习到C语言的基础知识,包括数据类型、运算符、控制结构、函数等,并通过实例讲解和实践操作,使学生能够熟练运用C语言进行编程。同时,学生也将学习到汇编语言的基础知识,包括寄存器、指令集、内存管理等,并通过实例讲解和实践操作,使学生能够熟练运用汇编语言进行编程。
在学习了C语言和汇编语言的基础知识后,学生将学习如何将这两种语言进行混合编程。混合编程是一种编程技术,它允许程序员在同一程序中同时使用两种或更多种编程语言。通过混合编程,程序员可以利用各种语言的优点,编写出更高效、更灵活的程序。
总的来说,自贡C语言与汇编语言混合编程实战班是一门非常实用的课程,它不仅能够帮助学生深入理解计算机底层原理,提高编程能力,还能够让学生学习到如何将不同的编程语言进行混合编程,从而提高编程效率。无论是对于计算机专业的学生,还是对于对编程感兴趣的非专业学生,这门课程都是一门非常好的选择。
如何C语言与汇编混编 1.在C中内嵌汇编语句在#pragma asm 与#pragma endasm 中加入要内嵌的汇编语句
例子:
#include <reg52.h>
void main()
{
P0^1=1;
#pragma asm
汇编延时程序
#pragma endasm
P0^1=0;
}
2.C程序调用汇编
(1)C文件格式
C程序调用汇编函数之前必须先用extern对函数加以声明
例子:
#include<reg51.h>
extern void DLY1s();
void main()
{
P2=0xff;
DLY1s();
P2=0;
}
(2)汇编文件格式
用NAME定义模块名,PUBLIC声明为公共函数,RESG为汇编函数起始标志
例子1:
;;************************************
;Delay time 1s
;;************************************
NAME DLY1s ;定义模块名
PUBLIC DLY1s ;声明为公共函数
SEG_DLY1s SEGMENT CODE ;在程序存储区中定义段
USING 1
RSEG SEG_DLY1s ;函数起始位置
;;--------------------------
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
;;-----------------------------------
END
例子2:
;;************************************
;Delay time 10ms
;;************************************
NAME DLY10ms
PUBLIC DLY10ms
SEG_DLY10ms SEGMENT CODE
USING 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
;;-----------------------------------
END
3.汇编调用C函数
(1)汇编文件格式
EXTRN CODE(function) ;声明所要调用的C函数
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV 30H,#5
MOV 31H,#6
CALL function ;调用C函数
MOV P2,32H
END
(2)C文件格式
#include <reg51.h>
#include <absacc.h>
void function()
{
DBYTE[0x32]=DBYTE[0x30]+DBYTE[0x31];
}
注:该方法简单且容易掌握,却有存储空间使用效率低的缺点,但在项目对存储空间需求较低的情况下,该方法是一个不错的选择
4通过寄存器传递参数的混合调用
相互之间的调用必须满足上述C调汇编和汇编调C的规则
例子1 C调用汇编:
C文件:
#include <reg51.h>
unsigned int ADD1(unsigned int a,unsigned int b)
void main()
{
unsigned int c;
c=ADD1(100,100);
}
汇编文件:
NAME _ADD1
PUBLIC _ADD1
SEG_ADD1 SEGMENT CODE
USING 1
RSEG SEG_ADD1
_ADD1:
MOV A,R5
ADD A,R7
MOV R7,A
MOV A,R4
ADDC A,R6
MOV R6,A
RET
END
注:当通过寄存器传递参数时在汇编里定义函数要用_函数名来定义函数
例子2 汇编调用C:
汇编文件:
EXTRN CODE(_function) ;声明所要调用的C函数,通过寄存器则函数为_function
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R7,#5 ;把所要传送的值放入响应寄存器单元
MOV R5,#6
CALL _function
MOV A,R7
END
C文件:
#include <reg51.h>
unsigned char function(unsigned char a,unsigned char b)
{
return(a+b);
}