⑴ 在C51单片机中如何在c语言中加入汇编程序
在
C
文件中要嵌入汇编代码片以如下方式加入汇编代码:
#pragma
ASM
;
Assembler
Code
Here
#pragma
ENDASM
其他参考
http://hi..com/layueyi/blog/item/e2cadaca1591e944f21fe7f3.html
⑵ C语言中怎样用汇编语言
_asm{
//你的汇编代码
}
⑶ 怎么在c语言程序中调用汇编宏定义
内联汇编:_asm { mov eax, xxxx }
⑷ 如何把汇编程序嵌入到C语言中
不同编译器嵌入汇编的方式不一样,具体如下:
一、Turbo
C ,
也就是所说的TC。
1、使用预处理程序的伪指令#asm和#endasm,#asm用来开始一个汇编程序块,而#endasm指令用于该块的结束。
参考代码:
int mul(int a, int b)
{
/*汇编开始*/
#asm
mov ax,word ptr 8[bp]
imul ax word ptr 10[bp]
#endasm
/*汇编结束。*/
}
2、使用asm语句:
格式:asm<汇编语句>
参考代码:
int mul(int a, int b)
{
asm mov ax,word ptr 8[bp]
asm imul ax word ptr 10[bp]
/*
每个asm对应一句汇编
注意结尾不需要分号
*/
}
二、VC++/VS
格式:
__asm
汇编指令
[
;
]
__asm
{
汇编指令
}
[
;
]
asm前面是两条下划线,后面的方括号内容表示分号可有可无。
使用方法:
1、一条一条地用:
__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al
每行一条汇编,
可以有分号,也可以没有。
2、组成一块地用:
__asm {
mov al, 2
mov dx, 0xD007
out dx, al
}
整体作为一个汇编代码块。
3、也可以将多条汇编写在一行:
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al
三、GNU
GCC
GCC对汇编的支持是最丰富的,简单介绍如下:
1、
用到的关键字:
“__asm__”
表示后面的代码为内嵌汇编,“asm”是“__asm__”的别名。
“__volatile__” 表示编译器不要优化代码,后面的指令保留原样,“volatile”是它的别名。
括号里面是汇编指令。
内嵌汇编语法如下:
__asm__(
汇编语句模板:
输出部分:
输入部分:
破坏描述部分)
一个简单的汇编模板:
int a=10,b;
asm("movl %1, %%eax;
movl %%eax, %0;"
:"=r"(b) /*输出部*/
:"r"(a) /*输入部*/
:"%eax" /*毁坏部*/
);
表示C语言里的“b=a;”。
里边r表示使用任意寄存器,%0、%1表示使用两个寄存器,一般只能%0~%9共十个操作数,按输入输出部变量出现顺序进行映射。
寄存器用两个百分号,是因为使用了%0%1这些数字使百分号有了特殊意义,所以在操作数出现的寄存器必须用双百分表示。
毁坏部里边的%eax表示eax寄存器在汇编代码块执行过程中会被改写,在执行前要保护好,这是提交给编译器决定的。
⑸ 在汇编语言中怎么加入C语言
分等级,c语言中可以嵌入汇编,但是汇编不能嵌入c语言,其实在c语言中的文件库里已经对汇编语言的各种语言段进行定义了,但是用的时候要先进行相应库的调用。
如楼上,对于定时来说,还是汇编语言准确的,这个要按需求来的,有的时候c语言中加入汇编,不仅方便,而且更容易修改,但是在碰到一些有浮点数的处理时,就不得不用c语言了
⑹ 如何在C语言中调用汇编指令序列
使用下面的方式即可:
asm //asm关键字指示编译器下面的段是汇编代码
{
//你需要写的汇编代码写在这里即可
}
⑺ 单片机中c语言中如何加入汇编
1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:
2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”
和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;
3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最
后文件;
4、编译,即可生成目标代码。
⑻ 如何在c语言中嵌入汇编语言
__asm
{
//汇编语言
}
⑼ 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语言中调用汇编的方法…*****
汇编语言没有高级语言要占用较大的存储空间和较长的运行时间等缺点,它的运行速度快是高级语言所不能比拟的。可以说高级语言与汇编语言各有千秋。有时我们采用高级语言编程速度达不到要求,全部采用汇编语言编程工作量又大,此时可以采用"混合"编程,彼此相互调用,进行参数传递,共享数据结构及数据信息,是一种有效的编程方法。这种方法可以发挥各种语言的优势和特点,充分利用现有的多种实用程序、库程序等使软件的开发周期大大缩短。
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 结 束 语
采用两种或两种以上的编程语言组合编程,彼此相互调用,进行参数传递,是一种有效的程序设计方法。这种方法可以充分发挥各种语言的优势,充分利用现有的实用程序,是当前程序接口技术的一个重要研究和应用领域
WIN-TC使用TC2内核
所以嵌入汇编得用TC2的语法:
方法是使用asm关键字:其格式是:
asm opcode <operands> <;newline>
例如:
main()
{
char *c="hello,world\n\r$";
asm mov ah,9
asm mov dx,c
asm int 33
printf("You sucessed!");
}
/*************** C内嵌汇编示例 ***************/
#include "stdio.h"
#include "conio.h"
int min(int v1,int v2)
{asm mov ax,v1;
asm cmp ax,v2;
asm jle minexit;
asm mov ax,v2;
minexit:
return(_AX);
}
main()
{printf("min(10,3) is %d\nmin(34,552) is %d",min(10,3),min(34,552));
getch();
}