最近两天开始学习linux内核,看了赵炯博士的《linux内核完全注释》感觉受益匪浅。今天看到第三章 嵌入汇编部分,于是写了一个小程序试验了一下,用gcc编译通过。代码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. typedef struct Array{
  6. char* chlist;
  7. int size;
  8. }array;
  9.  
  10. char* StrCopy(array *a1,array *a2){
  11. //int i;
  12. register char* _res;
  13. printf("字符串1: %s \n",a1->chlist);
  14. printf("字符串2: %s \n",a2->chlist);
  15. if(a1->size>a2->size){
  16. a2->chlist=(char*)malloc(a1->size*sizeof(char));
  17. a2->size=a1->size;
  18. }
  19. /*for(i=0;i<a1->size;i++){
  20. a2->chlist[i]=a1->chlist[i];
  21. }
  22. return a2->chlist;*/
  23. asm(
  24. "cld\n" // 清除方向位
  25. "\tmovl %%esi,%%ebx\n\t" //保存a2->chlist首地址
  26. "1: decl %3\n\t " //size--
  27. "js 4f\n\t" //if(size<0)跳转到4继续执行
  28. "lodsb\n\t" //ds:[esi]->al esi++
  29. "stosb\n\t" //al->es[edi] edi++
  30. "jmp 1b\n\t" //跳转到1执行
  31. "4:\n\t"
  32. "movl %%ebx,%%esi\n\t" //恢复esi
  33. :"=S"(_res)\
  34. :"D"(a2->chlist),"S"(a1->chlist),"c"(a1->size)\
  35. :"ebx"
  36. );
  37. return _res;
  38. }
  39.  
  40. int main(void){
  41. array l1;
  42. array l2;
  43. char* str;
  44. l1.chlist=l2.chlist=NULL;
  45. l1.size=l2.size=;
  46. l1.chlist="hello World!";
  47. l1.size=strlen(l1.chlist)+;
  48. //**************************
  49. str=StrCopy(&l1,&l2);
  50. printf("处理后字符串2:%s\n",str);
  51.  
  52. return ;
  53. }

实现了字符串的拷贝。

开始的时候汇编部分最后一行写法如下:

  1. :"edi","esi","ecx","ebx"

编译出错:

  1. StrCopy.c::: 错误: cant find a register in class CREG while reloading asm
  2. 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. Android开发文摘集合1

    作者:张明云 原标题:Android 开发中,有哪些坑需要注意? 作者github主页:zmywly8866.github.io/ 在Android library中不能使用switch-case语句 ...

  2. iOS socket编程

    // // ViewController.m // socket // // Created by emerys on 16/3/2. // Copyright © 2016年 Emerys. All ...

  3. Xcode4.4中,代码无法高亮、无法自动补全

    1.代码无法高亮显示:2.代码不能自动补全,或者给出提示建议:(当然这个补全的功能我在设置当中是打开的状态)3.新建一个项目,代码还是依然没有高亮显示,但是有补全功能:4.然后我就在网络上搜索了相关的 ...

  4. PS2251-07 海力士(金士顿U盘量产,成功!)

    U盘挂掉了,用芯片无忧测到是这个样子的,看到是PS2251-07 海力士的 网上找了很多方法都不成功,最后找到了两个可以量产成功的方法,建议使用第一种. 首先,附上三个检测工具 芯片无忧.GetInf ...

  5. .net程序员必须知道的知识

    A while back, I posted a list of ASP.NET Interview Questions. Conventional wisdom was split, with ab ...

  6. GET和POST详解

    GET和POST 表单提交方式 http的get提交方法把表单数据编码到url中,可以在浏览器地址栏中看到, post提交把表单数据编码到http请求包的正文部分,在url中啊可能不到数据

  7. shell 脚本中 命令

    终端工具tput和stty是两款终端处理工具tput cols,lines,longname,cpu 100 100 输入密码时,不能让输入的内容显示出来.用stty #!/bin/bash #Fil ...

  8. Html5游戏框架createJs的简单用法

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!http://www.it165.net/pro/html/201403/11105.html 楼主记忆力不好,最近刚好用了一下create ...

  9. webkit report

    %for main_o in objects: <% print main_o.sale_announcement_ids %> %for o in announcement_pool.b ...

  10. vim代码折叠功能

    问题:怎样在vim中实现代码折叠功能? 解决方法:直接使用vim自带的快捷键和命令,便可以实现功能强大的折叠 小试折叠: 1  :set fdm=marker  在vim中执行该命令 2  5G  将 ...