첫 번째 어셈블리 포함 C 프로그램

7560 단어 집성
최근 이틀 동안 linux 핵을 배우기 시작했는데 조형 박사의 《linux 핵 완전 주석》을 보니 이득이 적지 않았다.오늘 제3장이 어셈블리 부분에 박혀 있는 것을 보고 작은 프로그램을 써서 시험해 보았는데 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
" // "\tmovl %%esi,%%ebx
\t
" // a2->chlist "1: decl %3
\t
" //size-- "js 4f
\t
" //if(size<0) 4 "lodsb
\t
" //ds:[esi]->al esi++ "stosb
\t
" //al->es[edi] edi++ "jmp 1b
\t
" // 1 "4:
\t
" "movl %%ebx,%%esi
\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=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가 오류를 보고할 것이다.수정 후 컴파일이 통과되었습니다.
 
 
 
 

좋은 웹페이지 즐겨찾기