如何在汇编调用c语言函数?一、 参数传递c函数x86汇编语言的基本规则(ATPCS(ARM—Thumb Procedure Call Standard))
1、 参数传递
二、汇编程序、C程序相互调用举例
1、 C程序调用汇编程序
汇编程序的设计要遵守ATPCS(ARM—Thumb Procedure Call Standard),保证程序调用时参数的正确传递 。在汇编程序中使用EXPORT 伪操作声明本程序c函数x86汇编语言,使得本程序可以被别的程序调用 。在C程序使用extern声明该汇编程序 。
下面是一个C程序调用汇编程序的例子 。其中汇编程序strcopy实现字符串复制功能c函数x86汇编语言,C程序调用strcopy完成字符串复制的工作 。
//C程序
#include stdio.h
extern void strcopy(char *d,const char *s);
int main( )
{
const char *srcstr=”First string-source”;
char dststr[ ]=”Second string-destination”;
printf(“Before copying:\n”);
printf(“%s\n %s\n”, srcstr,dststr);
strcopy(dststr,srcstr);
printf(“After copying:\n”);
printf(“%s\n%s\n “,srcstr,dststr);
while(1) ;
}
;汇编程序
AREAScopy,CODE,READONLY
EXPORT strcopy
Strcopy
LDRBR2,[R1],#1
STRBR2,[R0],#1
CMPR2,#0
BNEStrcopy
MOVPC,LR
END
2、 汇编程序调用C程序
汇编程序的设计要遵守ATPCS,保证程序调用时参数的正确传递 。在汇编程序中使用IMPORT伪操作声明将要调用的C程序 。下面是一个汇编程序调用C程序的例子 。其中在汇编程序中设置好各参数的值 。本例中有6个参数c函数x86汇编语言,分别使用寄存器R0存放第1个参数,
R1存放第2个参数, R2存放第3个参数, R3存放第4个参数, 第5个、第6个参数利用数据栈传送 。由于利用数据栈传递参数c函数x86汇编语言,在程序调用结束后要调整数据栈指针 。
//C程序g()返回6个参数的和
int g( int a, int b, int c, int d, int e, int f )
{
printf(“e=%d\n”, e);
printf(“f=%d\n”, f);
return (a b c d e f);
}
; 汇编程序调用C程序 g( ) 计算6个整数 i, 2*i,3*i,4*i,5*i,6*i的和
EXPORTf
AREAf ,CODE,READONLY
IMPORTg
MOVR0, #1
ADDR1, R0, R0
ADDR2, R1, R0
ADDR3, R2, R0
ADDR4, R3, R0
ADDR5, R4, R0
STRR4, [SP,#-4]!
STRR5, [SP, #-4]!
BLg
ADDSP, SP, #4
ADDSP, SP, #4
STOPBSTOP
END
用x86 CPU汇编语言设计一个实现如下C语言语句功能的程序data segment;定义数据段,你说浮点数类型,也没讲是双精度还是单精度 。我这里用字类型 。
xDW1000 dup(?)
sDW?
data ends
codesegment;定义代码段
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,1000 ;设置循环次数
lea bx,x ;装载数组首地址
mov ax,s
L1:add [bx],ax;加法操作
add bx,2;指针后移,指向下一数组元素 。这里因为是字类型,所以后移两个字节 。
loop L1
mov ax,4c00h
int 21h
code ends
end start
这段代码超简单 。我已经在本机运行过 。但是你就这么运行结果都为零 。因为你没给我数组的初值 。但是这段代码完全实现你想要的功能 。你要是还不明白 , 我也没办法 。你用的时候赋初值就行,就那个数据段有 ?的地方换成数据,明白吧 。
x86汇编语言的MOV指令MOV在汇编语言中是 数据传送指令 。
用法如下:
mov — Move (Opcodes: 88, 89, 8A, 8B, 8C, 8E, ...)
mov指令将第二个操作数(可以是寄存器的内容、内存中的内容或值)复制到第一个操作数(寄存器或内存) 。mov不能用于直接从内存复制到内存,其语法如下所示:
mov reg,reg
mov reg,mem
mov mem,reg
mov reg,const
mov mem,const
Examples
mov eax, ebx — 将ebx的值拷贝到eax
mov byte ptr [var], 5 — 将5保存找var指示内存中的一个字节中
C语言调用X86汇编PROC , 是怎样传递参数的分两种,一种是按值传递 , 一种是按地址传递,
按值传递就是在子函数中开辟出一个临时内存空间,将传递的数值保存在这个空间中,当子函数结束后,这个内存空间就会释放了!
按地址传递则是把主函数开辟的某个内存空间首地址传递给子函数,子函数可以直接读写主函数上这段内存空间,当子函数结束后,这部分空间不会被释放,主函数将继续使用这段空间!
单片机汇编语言中怎么调用C函数一般都是C调用汇编的,你倒是反过来了,在C函数中,如果要严格时序或者精确操作的要求,某一段会用汇编来写 , 不管是C调用汇编,还是汇编调用C,你都要对编译环境相当熟悉,C的零时变量一边用在第一组的R2、R3、R4、R5;R6和R7一般用来传递数据 , 个人理解 。
x86汇编语言 转换16进制到2进制并返回到c程序MAIN PROC FAR
ASSUME CS:A1
START: PUSH DS
SUB AX,AX
PUSH AX
MOV BX,0110 1101 0011 0111B;6D37H
MOV CH,4
B1: MOV CL,4
ROL BX,CL;将BX中的数循环左移4位,也就是把BX最高4位,放到BX的最低4位上去 。
MOV AL,BL;将低8位放入AL
AND AL,0FH;取低4位
ADD AL,30H;加上30H从这里开始将4位二进制数转成16进制ASCII码,
;0--的ASCII码是30H…9是39H,A是41H,B是42H…F是46H
CMP AL,3AH;加结果是不是少于3A
JL B2;是的话,表示是0-9之中数
ADD AL,7H;否则还要加上7,变成对应的A或B、C、D、E、F
B2: MOV DL,AL ;AL是转换好的一位16进制数的ASCII码
MOV AH,2
INT 21H;显示到屏幕
DEC CH
JNZ B1;因为BX中其有4位16进制数,所以要处理4次 。这里是判断处理完4次没,如果没有,就继续处理下一个数
RET
MAIN ENDP
A1 ENDS
END START
这个程序的功能是将BX中的0110 1101 0011 0111B(6D37H)以16进制显示在屏幕上 。
“显示在屏幕”的准确说法是:输出到系统标准控制台上 。
【c函数x86汇编语言 汇编 c语言】c函数x86汇编语言的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于汇编 c语言、c函数x86汇编语言的信息别忘了在本站进行查找喔 。
推荐阅读
- 直播斜桥网红,斜桥味道怎么样
- rediskey去重,redis zset去重
- dedehtml5模板的简单介绍
- 电脑怎么查几核,电脑怎么查是几核的
- go判断语言包含子字符串 字符串判断是否包含
- 神奇宝贝Go可以调整语言,神奇宝贝go怎么设置中文
- 阿里云试用服务器密码,阿里云服务器开机密码是什么
- linux激活网络的命令 linux激活网卡命令
- 管易erp系统退款订单,管易erp登陆