我怕我不寫下來,將來我都不記得我還在 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; }