最近两天开始学习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程序的更多相关文章

  1. KEIL C51程序中如何嵌入汇编

    模块内接口:使用如下标志符:#pragma asm汇编语句#pragma endasm注意:如果在c51程序中使用了汇编语言,注意在Keil编译器中需要激活Properties中的“Generate ...

  2. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  3. GCC 嵌入汇编代码

    The format of basic inline assembly is very much straight forward. Its basic form is 基本汇编嵌入格式如下: asm ...

  4. 通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制

    作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用A ...

  5. KEIL C51 中嵌入汇编以及C51与A51间的相互调用

    如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例 有关c51调用汇编的方法已经有很多帖子讲到,但是一般只讲要点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者通过一个简单例子 ...

  6. 在C中嵌入汇编

    早前公布了C和汇编混编的温度控制器程序,收到一些朋友的询问,他们无法在自己程序中使用我的18B20的汇编子程序或无法正常通过混编后的程序编译. 其实在KEIL中嵌入汇编的方法很简单.如图一,在C文件中 ...

  7. C嵌入汇编

    概述:linux内核源码中,有很多C语言中嵌入了汇编语句,如何理解这些汇编语句,对理解内核有很重要的作用. 具有输入和输出参数的嵌入式汇编语句的基本格式为: asm("汇编语句" ...

  8. 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...

  9. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call. 系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变 ...

随机推荐

  1. oracle 里面定时执行任务,比如存储过程内容等。

    DECLARE   job_no_ NUMBER;   BEGIN      DBMS_JOB.SUBMIT(job_no_,                   'proc_qszx_dw_sc(' ...

  2. Maven搭建Spring+Struts2+Hibernate项目详解

    http://www.bubuko.com/infodetail-648898.html

  3. iOS NSData简单解析

    iOS 基本数据类型之NSData 1 nsdata 作用: 用于存储二进制的数据类型 nadat类提供一种简单的方式,它用来设置缓存区.将文件的内容读入到缓存区.或者将缓存区中的内容写到一个文件. ...

  4. Java设计模式(学习整理)---策略模式

       1. 模式定义         把会变化的内容取出并封装起来,以便以后可以轻易地改动或扩充部分,而不影响不需要变化的其他部分: 2.模式本质:  少用继承,多用组合,简单地说就是:固定不变的信息 ...

  5. hdoj 2049 错排

    代码: #include <stdio.h> int main(){ int n,a,b,i,j; __int64 s[22],h[22]; s[1]=0; s[2]=1; s[3]=2; ...

  6. Node 之 Express 学习笔记 第一篇 安装

    最近由于工作不忙,正好闲暇时间学学基于 node 的 web开发框架. 现在关于web开发框架除了Express 还有新出的 KOA以及其它一些. 但是想想还是先从 Express 入手吧.因为比较成 ...

  7. linux下Rtree的安装

    1. 首先安装依赖libspatialindexhttp://libspatialindex.github.io/ sudo ./configure sudo make sudo make insta ...

  8. CoreLocation MKMapView

    高德开发者平台 有开发指南 iOS9配置网络: <key>NSAppTransportSecurity</key> <dict> <key>NSAllo ...

  9. sql新增后返回主键

    对于刚学的人来说有点帮助,新增后返回主键有两种方法: 1,返回自增的主键: INSERT INTO 表名 (字段名1,字段名2,字段名3,…) VALUES (值1,值2,值3,…) SELECT @ ...

  10. 关于asp.net core部署到iis中出现 HTTP Error 502.5 - Process Failure的问题

    环境是windows Server2008R2 出现这个问题搞了一下午都没解决,最后又加班才算搞定,由于英文不太好,官方的文档看了好几遍,也按照文档做的,但还是出现这个问题,百度google搜了很多解 ...