zoukankan      html  css  js  c++  java
  • 第一个嵌入汇编的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 
    ",a1->chlist);
        printf("字符串2: %s 
    ",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
    "             // 清除方向位  
            "	movl %%esi,%%ebx
    	"    //保存a2->chlist首地址
            "1: decl %3
    	 "        //size--
            "js 4f
    	"            //if(size<0)跳转到4继续执行
            "lodsb
    	"            //ds:[esi]->al esi++ 
            "stosb
    	"            //al->es[edi]  edi++ 
            "jmp 1b
    	"            //跳转到1执行
            "4:
    	"                
            "movl %%ebx,%%esi
    	"        //恢复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=0;
        l1.chlist="hello World!";
        l1.size=strlen(l1.chlist)+1;
        //**************************
              str=StrCopy(&l1,&l2);
        printf("处理后字符串2:%s
    ",str);
    
        return 0;
    }

    实现了字符串的拷贝。

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

    :"edi","esi","ecx","ebx"

    编译出错:

    StrCopy.c:23:2: 错误: can’t find a register in class ‘CREG’ while reloading ‘asm’
    StrCopy.c:23:2: 错误: ‘asm’操作数中有不可能的约束

    在网上查了一下原因,从一篇博文中得知:"edi","esi","ecx" 已经在输入列表中给出,会被修改寄存器列表再次给出,gcc就会报错。修改后编译通过。

  • 相关阅读:
    css3背景色过渡
    HttpUtility.UrlEncode与Server.UrlEncode()转码区别
    js 中编码(encode)和解码(decode)的三种方法
    jQuery 页面加载初始化
    oracle 索引失效原因_汇总
    jdbc连接数据库使用sid和service_name的区别
    作为首席架构师,我是如何选择并落地架构方案的?
    (二)、JAVA运行时数据区域
    (一)、Java内存模型
    Java中Volatile关键字详解
  • 原文地址:https://www.cnblogs.com/ren19930504/p/3346410.html
Copyright © 2011-2022 走看看