gcc 在c代碼中內嵌匯編調用c函數: 只是證明曾經我來過


我怕我不寫下來,將來我都不記得我還在 c 中嵌套過匯編語言,用匯編代碼調用一個c函數的過程。

折騰了一下午,在網上查看相關的資料,然后照葫蘆畫瓢地在c代碼中嵌套匯編,希望解決我所遇到的問題,可最后發現全是徒勞。

根據我的初步了解,在c中嵌套匯編來調用一個c函數的時候, 當c函數的參數過多時, 匯編代碼沒辦法寫, 好像對參數的數量有相當大的限制。

下面的代碼,如果我將c函數的參數增加到3個時, 匯編代碼我就寫不出來了,  並不能通過簡單的在匯編代碼中增加一個參數來實現。

多增加一個參數,編譯代碼時,就會拋出錯誤:'asm' operand has impossible constraints|  ('asm'操作數有不可能的約束)

我是徹底的放棄了,到此為止吧。

 

int abc2(int a, int b)
{
printf("\n");

printf("參數a(%d): %d\n", &a, a);
printf("參數b(%d): %d\n", &b, b);
//printf("參數c(%d): %d\n", &c, c);
//printf("參數d(%d): %d\n", &d, d);

return a > b ? a : b;
}

 

int main(int argc, char *argv[])
{
void *saved_my_esp, *target_addr;
unsigned int return_eax, return_edx;

void *func = abc2;

int a = 10;
int b = 20;
int c = 30;
int d = 40;

printf("&a:%d\n", &a);
printf("&b:%d\n", &b);
printf("&func:%d\n", func);


//參考: https://bbs.csdn.net/topics/360148698


__asm__ __volatile__ (

"movl %%esp, %0;"

"movl %3, %%eax;" //變量: d
"push %%eax;"

"movl %4, %%eax;" //變量: c
"push %%eax;"


"movl %5, %%eax;" //函數
"call *%%eax;"

"mov %%eax, %1;"
"mov %%edx, %2;"
"movl %0, %%eax;"

//"movl %%eax, %%esp;" /** 加這一句, 就出錯 **/

: "+m" (saved_my_esp), "=m" (return_eax), "=m" (return_edx)

: "r"(b), "r"(a), "r"(func) // 關於 m, r 說明: https://www.cnblogs.com/Jezze/archive/2011/12/23/2299838.html

: "%eax", "%edx", "%esp"
);

printf("saved_my_esp:%d\n", saved_my_esp);
printf("return_eax:%d\n", return_eax);
printf("return_edx:%d\n", return_edx);

printf("\n");

//printf("return_value:'%s'\n", return_eax
//printf("return_value:%d\n", *(int *)return_eax);
//printf("return_value:%lf\n", *(float *)return_eax);
//printf("return_value:%d\n", *(BYTE *)return_eax);

printf("return_value:%d\n", return_eax);

printf("\n");

printf("------------------end-------------\n");

return 0;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM