C语言与汇编嵌套调用学习心得:从ARM编程到GCC与ADS实践
版权申诉
41 浏览量
更新于2024-08-22
收藏 56KB PDF 举报
"c语言和汇编语言相互嵌套调用的学习总结"
本文主要探讨了在C语言中嵌入汇编代码以及如何在不同的编译环境下进行C语言和汇编语言的相互调用,特别是在ARM架构下的编程。实验旨在让学习者熟悉ARM编程的编译环境,如ADS和调试器ATX,以及掌握C和汇编的混合编程技巧。
首先,作者提到了在GCC编译器中,C语言嵌入的汇编代码是基于AT&T语法,不同于通常学习的Intel x86汇编。GCC支持的内嵌汇编有三种基本语法格式:
1. 使用双下划线的`__asm__`语法,适用于Linux GCC:
```c
__asm__(
"instruction",
...
"instruction");
```
2. ADS编译器支持的`__asm`语法,同样需要双下划线:
```c
__asm{
instruction,
...
instruction};
```
3. C++中使用单下划线的`asm`关键字:
```c++
asm("instruction[;instruction]");
```
接着,作者提供了两个示例来说明C语言中嵌入汇编的实际应用。第一个例子是在Linux环境下,使用GCC编译器,嵌入的汇编代码用于实现两个整数相加的功能:
```c
#include<stdio.h>
int plus(int a, int b) {
__asm__(
"add %1, %0\t": "+r"(a): "r"(b)
);
return (a); // 注意返回值应为a,而非未定义的变量c
}
int main() {
int a = 2, b = 1, c;
c = plus(a, b);
printf("c=%d\n", c);
}
```
在这个例子中,`__asm__`块内的汇编代码将`b`加到`a`上,并且通过`"+r"`约束修改`a`的值。
第二个例子是在ADS环境下,使用汇编代码实现字符串复制功能:
```c
#include<stdio.h>
void my_strcpy(char* src, const char* dst) {
int ch;
__asm__ (
"ldrb %0, [%1]\n\t"
"strb %0, [%2]\n\t"
"cmp %1, #0\n\t"
"bne -4\n\t"
: "=r"(ch), "+r"(dst), "+r"(src)
:
: "memory"
);
}
```
这段汇编代码通过循环逐个读取源字符串的字节并存入目标字符串,直到遇到空字符(即字符串结束)。
通过这样的实验和学习,不仅可以了解不同编译环境对汇编语言的支持,还能掌握如何在C语言中嵌入汇编代码以优化特定性能关键的部分。同时,了解如何在ARM环境下进行调试和编译,对于嵌入式系统开发有着重要的实践意义。
2013-10-09 上传
2022-03-15 上传
2021-09-30 上传
2021-09-19 上传
2010-05-09 上传
2021-10-11 上传
2021-09-05 上传
2010-08-17 上传
点击了解资源详情
fuhongy
- 粉丝: 0
- 资源: 4万+
最新资源
- notes
- vb地籍登记管理系统设计(源代码+论文+开题报告+外文翻译+答辩ppt).zip
- Educrack
- sui-button:在npm上发布按钮
- reproductive-health-rights:这个程序将允许性活跃的年轻人访问有关性健康的信息,并找到最近的健康诊所
- javalist源码-exercism:我的源代码exercism-exercises列表(http://exercism.io)
- gettingStartedwithGithubInMITMysore
- leetcode答案-leetcode:leetcode记录没事刷着玩儿的题目
- “我的下載”-crx插件
- 电脑股票背景的金融投资PPT模板
- FightWatchAndroidApplication:Fight Watch Android应用程序
- Kommota-frontend
- 易语言-文字编码转换支持库2.0#50版
- NoScript-crx插件
- manfred
- vb仓库管理系统与实现(论文+源代码+开题报告+外文翻译+文献综述).zip