㈠ 汇编和c语言如何结合的
汇编语言没有高级语言要占用较大的存储空间和较长的运行时间等缺点,它的运行速度快是高级语言所不能比拟的。可以说高级语言与汇编语言各有千秋。有时我们采用高级语言编程速度达不到要求,全部采用汇编语言编程工作量又大,此时可以采用"混合"编程,彼此相互调用,进行参数传递,共享数据结构及数据信息,是一种有效的编程方法。这种方法可以发挥各种语言的优势和特点,充分利用现有的多种实用程序、库程序等使软件的开发周期大大缩短。
1 高级语言与汇编语言的接口需要解决的问题
1、需要说明和建立调用者与被调用者间的关系被调用的过程或函数应预先说明为外部类型,如汇编子程序,应用PUBLIC说明其可被外部模块引用;调用程序则应预先说明要引用的外部模块名。
2、参数传递问题在汇编子程序之间通常采用寄存器作为参数传递的工具,汇编语言与高级语言程序间的参数传递,一般采用堆栈来传递,即调用程序将参数依次压入堆栈中,当被转调用程序后,再从堆栈中依次弹出参数作为操作数使用。为此,必须了解各种语言的堆栈结构、生成方式和入栈方式等。BASIC、FORTRAN、PASCAL等语言其参数进栈顺序是与参数在参数表中出现的顺序相同,即从右到左;而C语言则相反。
2 C语言与汇编语言的接口
2.1 C语言调用汇编子程序
●在C程序中使用关键字"ExTERn"对函数作显式说明。
●参数传递顺序是按其在参数表中出现的顺序的反序被压入堆栈中,即第一个参数最后进入堆栈,它在栈中的地址最低。
●对不同的存储模式(极小、小、紧凑、中、大和巨)要选用不同的汇编语言格式,如C程序为小模式,汇编用近过程,C程序为大模式,汇编用远过程。
●汇编程序取C的参数。远过程返回地址占四个字节,BP压入占二字节,所以第一个参数在BP+6所指向的单元。对于近过程第一个参数在BP+4所指向的单元。
●汇编程序中寄存器的保护。TuRboC允许子过程使用SI和DI存放局部变量,当寄存器变量多于二个时,多余部分会自动转到堆栈中存储。因此,汇编过程的格式为:
PUSH BP
MOV BP,SP
PUSH DI
PUSH SI�
……….
语 句�
………….
POP SI
POP DI
POP BP
RET
●返回值。每种C数据类型都有一个标准的返回位置,一般在AX中(极小、小、中模式),DX:AX(紧凑、大、巨模式),如:chaR,unSignEdchaR,Enum,ShoRTinT等,返回值位置为AX,且返回数据必须放置在RET指令之前。汇编子程序要定义为远过程,并用PUBLIC伪指令把过程名定义为公共。例
:#includE〃STdio.h〃
#includE〃STdlib.h〃
chaRMESSagE[]=〃MESSagE〃;
inTfaRREVSTR(chaRfaR STR);
Voidmain(Void)
{ REVSTR((chaRfaR )MESSagE);
printf(〃%S〃,MESSagE);
}
REVSTR.asm
…
PUBLIC-REVSTR-
REVSTR PROC
PUSH BP
MOVBP,SP
PUSH DS
PUSH SI
PUSH DI
…
POP SI
POP AX
MOV DS,AX
POP BP
MOV AX,CX
RET
REVSTR ENDP
END
2.2 C语言嵌入汇编
在C程序中允许直接编写汇编语言代码,这称作嵌入汇编。C程序中嵌入汇编后可以无分号(C语言的语句以分号结束,汇编语句是C语言中唯一以换行结束的语句),以关键词ASM张一个嵌入汇编指令,如需多个ASM语句,可以将它们放在花括号内。如,
ASMMOVAX,DX/ 注释 /
ASM
PUSHAX}/ 注释 /
C语言允许嵌入四类汇编命令:一般指令、串指令、跳转指令、数据分配和定义指令,嵌入汇编比调用汇编子程序更方便、灵活、功能也更强。但嵌入汇编不是一个完整的汇编程序,所以许多错误不能马上检查出来。
3 结 束 语
采用两种或两种以上的编程语言组合编程,彼此相互调用,进行参数传递,是一种有效的程序设计方法。这种方法可以充分发挥各种语言的优势,充分利用现有的实用程序,是当前程序接口技术的一个重要研究和应用领域
㈡ 单片机。分别使用c语言和汇编语言编写一个程序
#include<reg52.h>
unsignedcharaa_at_0x30;
voidmain()
{
IE=0x81;
IT0=1;
aa=0;
while(1);
}
X0_INT()interrupt0
{
aa++;
aa%=100;
}
//====================
ORG0000H
LJMPSTART
INC30H
MOVA,#100
CJNEA,30H,EXIT
MOV30H,#0
EXIT:
RETI
START:
MOVIE,#81H
SETBIT0
MOV30H,#0
SJMP$
END
上面两个程序,均经过试验,可以满足题目要求。
㈢ 我主程序是用汇编语言编写的,现在我要调用一段用C语言编写的子程序我该怎么调用用什么语句
你可以把C语言编写的子程序放在一个lib库中,然后include进汇编源文件中,加以调用
㈣ 51单片机编程时汇编和C语言如何结合
在keil工程栏中右键.c文件选择OptionsforFile
然后把这2个勾上
㈤ 在kei里,用C语言编写了主程序,怎么调用用汇编编写的延时子程序
对于问题我想说以下几点:
1.Proteus仿真时需要加载的是经过汇编(由汇编语言编写的源程序文件时)或编译与汇编(由C或其他高级语言编写的源程序文件要先编译成汇编语言,再汇编成hex、bin文件)的hex文件(称为目标文件)。
2.Proteus与C语言没有必然关系,要的只是hex文件,可以经过编译生成hex文件的语言一大堆。
3.学好Proteus没有成就感,Proteus只适合一些小的设计,上不了正堂,而且Proteus仿真过的,实物不一定行的通,Proteus只适合理论上的初步验证,当然学了还是多多益善。
4.汇编语言比C语言等在生成hex文件时形成指令的效率更高,比如,汇编语言几乎每一句都有用,都会生成有效的二进制指令(除伪指令外),而C语言在生成二进制指令时有好多多余的语句(比如函数调用时的不必要的入堆栈保护)。
5.汇编简练,不易移植,不适合大一点的工程;C的编译效率低,但是可移植性好,总之各有优势,你现在看的应该是一些学习性的单片机程序,当然是小程序,经常遇到汇编就正常。
6.建议既要会C也要会汇编,这样在以后用C等编写的大工程中调试程序时,也可以知道某条语句其实现的原理,以便更好发现问题,解决问题。
㈥ 求一个在C语言里面嵌套汇编语言的程序!(悬赏分可以再加,只有给得好)
建议你先了解__asm{ }的作用,
__asm
{
MOV eax 0x12345678
MOV ecx eax
}
注意VC编译器要打补丁(SP6),不然编译器会死。我这是在机房,刚要运行就死了。所以不好意思没有检查是否有误。汇编就是对三个对象做操作寄存器(Register),内存(Memory),立即数(immediate),希望对你有帮助
㈦ c语言中调用汇编程序问题
C语言里面的语句found(i,&j,&k,s);
翻译为汇编语言是下面这样的:
PUSH
[I]
PUSH
J
PUSH
K
PUSH
[S]
CALL
_found
现在看_FOUND的入口代码:
PUSH
BP
MOV
BP,SP
你现在明白[BP]是什么了吗?是原来的BP
[BP+2]是CALL处的IP
[BP+4]是什么知道吗?就是实际参数S的值
现在明白了吧。
㈧ c语言中如何调用汇编程序
汇编语言的基本格式为: PUBLIC _FOUND _TEXT SEGMENT BYTE PUBLIC 'CODE'ASSUME CS: _TEXT _FOUND PROC NEARPUSH BPMOV BP,SPMOV CX,[BP+4]DEC CXMOV SI,[BP+10]LODSWMOV DX,1 MOV BX,0 COMP: CMP AX,[SI]JA BIGGERMOV AX,[SI]MOV BX,DXBIGGER: INC SIINC SIINC DXLOOP COMPMOV DI,[BP+6] MOV [DI],AX MOV DI,[BP+8] MOV [DI],BXPOP BPRET_FOUND ENDP_TEXT ENDSEND为了看得更清楚,我们把代码去掉,留下基本框架: PUBLIC _FOUND _TEXT SEGMENT BYTE PUBLIC 'CODE'ASSUME CS: _TEXT _FOUND PROC NEARPUSH BPMOV BP,SP ......... ;从这里开始加入汇编代码 POP BPRET_FOUND ENDP_TEXT ENDSEND这是在samll(小模式)下的汇编语言接口框架,在加入代码处,写上你所要完成一定功能的汇编代码,就成为一个可供TC调用的汇编模块。 可以看出,代码段是以带下划线的标识符开头的。 代码段的标识为_TEXT,由C程序中调用的函数found在这里也是以下划线标出:_FOUND。 下面是代码段的组成: _TEXT SEGMENT BYTE PUBLIC 'CODE' _TEXT ENDS下面是函数的组成: _FOUND PROC NEAR _FOUND ENDP 在small(小模式下,只要按照以上的格式书写汇编代码,就一定能成功地被C程序调用。 这个格式是TC编译程序所定好了的,如果不按照这个格式书写汇编代码,调用就不会成功。
㈨ 在汇编程序中怎么调用C语言子程序
汇编程序调用C程序。
汇编程序的设置要遵循ATPCS规则,保证程序调用时参数的正确传递。汇编程序调用C程序的方法如下:
在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数;
在调用C程序时,要正确设置入口参数,然后使用BL指令调用
㈩ C语言中如何调用汇编子程序给个例子讲解下
你是指内联汇编吧?比如下面这个例子:
#include<stdio.h>
intfunc(inta,intb)
{
returna-b;
}
intmain()
{
//计算12-5
inta=12,b=5;//给定两个数
intres;//用来记录结果
__asm{//内联汇编
pushb;//b压栈
pusha;//a压栈,注意C中函数接受参数的时候入栈是反着的
callfunc;//调用函数func,返回值保存在eax里
movres,eax;//将eax里的值赋给res
}
printf("%d ",res);//输出结果,得到7
return0;
}