第一个嵌入汇编的C程序
最近两天开始学习linux内核,看了赵炯博士的《linux内核完全注释》感觉受益匪浅。今天看到第三章 嵌入汇编部分,于是写了一个小程序试验了一下,用gcc编译通过。代码如下:
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- typedef struct Array{
- char* chlist;
- int size;
- }array;
- char* StrCopy(array *a1,array *a2){
- //int i;
- register char* _res;
- printf("字符串1: %s \n",a1->chlist);
- printf("字符串2: %s \n",a2->chlist);
- if(a1->size>a2->size){
- a2->chlist=(char*)malloc(a1->size*sizeof(char));
- a2->size=a1->size;
- }
- /*for(i=0;i<a1->size;i++){
- a2->chlist[i]=a1->chlist[i];
- }
- return a2->chlist;*/
- asm(
- "cld\n" // 清除方向位
- "\tmovl %%esi,%%ebx\n\t" //保存a2->chlist首地址
- "1: decl %3\n\t " //size--
- "js 4f\n\t" //if(size<0)跳转到4继续执行
- "lodsb\n\t" //ds:[esi]->al esi++
- "stosb\n\t" //al->es[edi] edi++
- "jmp 1b\n\t" //跳转到1执行
- "4:\n\t"
- "movl %%ebx,%%esi\n\t" //恢复esi
- :"=S"(_res)\
- :"D"(a2->chlist),"S"(a1->chlist),"c"(a1->size)\
- :"ebx"
- );
- return _res;
- }
- int main(void){
- array l1;
- array l2;
- char* str;
- l1.chlist=l2.chlist=NULL;
- l1.size=l2.size=;
- l1.chlist="hello World!";
- l1.size=strlen(l1.chlist)+;
- //**************************
- str=StrCopy(&l1,&l2);
- printf("处理后字符串2:%s\n",str);
- return ;
- }
实现了字符串的拷贝。
开始的时候汇编部分最后一行写法如下:
- :"edi","esi","ecx","ebx"
编译出错:
- StrCopy.c::: 错误: can’t find a register in class ‘CREG’ while reloading ‘asm’
- StrCopy.c::: 错误: ‘asm’操作数中有不可能的约束
在网上查了一下原因,从一篇博文中得知:"edi","esi","ecx" 已经在输入列表中给出,会被修改寄存器列表再次给出,gcc就会报错。修改后编译通过。
第一个嵌入汇编的C程序的更多相关文章
- KEIL C51程序中如何嵌入汇编
模块内接口:使用如下标志符:#pragma asm汇编语句#pragma endasm注意:如果在c51程序中使用了汇编语言,注意在Keil编译器中需要激活Properties中的“Generate ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- GCC 嵌入汇编代码
The format of basic inline assembly is very much straight forward. Its basic form is 基本汇编嵌入格式如下: asm ...
- 通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制
作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用A ...
- KEIL C51 中嵌入汇编以及C51与A51间的相互调用
如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例 有关c51调用汇编的方法已经有很多帖子讲到,但是一般只讲要点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者通过一个简单例子 ...
- 在C中嵌入汇编
早前公布了C和汇编混编的温度控制器程序,收到一些朋友的询问,他们无法在自己程序中使用我的18B20的汇编子程序或无法正常通过混编后的程序编译. 其实在KEIL中嵌入汇编的方法很简单.如图一,在C文件中 ...
- C嵌入汇编
概述:linux内核源码中,有很多C语言中嵌入了汇编语句,如何理解这些汇编语句,对理解内核有很重要的作用. 具有输入和输出参数的嵌入式汇编语句的基本格式为: asm("汇编语句" ...
- 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call. 系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变 ...
随机推荐
- Android开发文摘集合1
作者:张明云 原标题:Android 开发中,有哪些坑需要注意? 作者github主页:zmywly8866.github.io/ 在Android library中不能使用switch-case语句 ...
- iOS socket编程
// // ViewController.m // socket // // Created by emerys on 16/3/2. // Copyright © 2016年 Emerys. All ...
- Xcode4.4中,代码无法高亮、无法自动补全
1.代码无法高亮显示:2.代码不能自动补全,或者给出提示建议:(当然这个补全的功能我在设置当中是打开的状态)3.新建一个项目,代码还是依然没有高亮显示,但是有补全功能:4.然后我就在网络上搜索了相关的 ...
- PS2251-07 海力士(金士顿U盘量产,成功!)
U盘挂掉了,用芯片无忧测到是这个样子的,看到是PS2251-07 海力士的 网上找了很多方法都不成功,最后找到了两个可以量产成功的方法,建议使用第一种. 首先,附上三个检测工具 芯片无忧.GetInf ...
- .net程序员必须知道的知识
A while back, I posted a list of ASP.NET Interview Questions. Conventional wisdom was split, with ab ...
- GET和POST详解
GET和POST 表单提交方式 http的get提交方法把表单数据编码到url中,可以在浏览器地址栏中看到, post提交把表单数据编码到http请求包的正文部分,在url中啊可能不到数据
- shell 脚本中 命令
终端工具tput和stty是两款终端处理工具tput cols,lines,longname,cpu 100 100 输入密码时,不能让输入的内容显示出来.用stty #!/bin/bash #Fil ...
- Html5游戏框架createJs的简单用法
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!http://www.it165.net/pro/html/201403/11105.html 楼主记忆力不好,最近刚好用了一下create ...
- webkit report
%for main_o in objects: <% print main_o.sale_announcement_ids %> %for o in announcement_pool.b ...
- vim代码折叠功能
问题:怎样在vim中实现代码折叠功能? 解决方法:直接使用vim自带的快捷键和命令,便可以实现功能强大的折叠 小试折叠: 1 :set fdm=marker 在vim中执行该命令 2 5G 将 ...