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就会报错。修改后编译通过。

  • 相关阅读:
    Android Studio安装与配置
    T-SQL:qualify和window 使用(十七)
    《c#图解教程》
    c# 创建,加载,修改XML文档
    c# 使用迭代器来创建可枚举类型
    C#上手练习3(while、do while语句)(添加机器人聊天)
    C#上手练习2(FOR语句)
    C#上手练习1(if语句、Swich语句)
    解决java导入project出现红叉
    ABAP ALV显示前排序合并及布局显示
  • 原文地址:https://www.cnblogs.com/ren19930504/p/3346410.html
Copyright © 2011-2022 走看看