2012-11-03 88 views
2

我想知道在.c彙編代碼中是否有調用方法? 我想把這個代碼在我的.c文件在c中執行彙編代碼

彙編代碼我想在.c文件執行回我知道答案是把EAX地址

1. mov eax, 0x2d 
2. mov ebx, 0 
3. int 0x80 

這是.c文件的一部分:

1. void function(void) 
2. { 
3. void *sp; 
4. sp = eax; 
5. fprintf(stderr, "system break: %p\n", sp); 
6. } 

我該怎麼辦呢?

+0

哪個C編譯器您使用? –

+0

什麼是C代碼應該做什麼,在eax中有什麼價值,什麼是sp? – hyde

+0

@hyde我使用gcc和sp只是一個變量,並且想要這樣做,fprintf(stderr,「system break:%p \ n」,sp);當我有sp,sp有eax值時,eax中的值就像0x99ae000 –

回答

5

執行此操作的功能是特定於編譯器的。海灣合作委員會允許這個using its asm keyword extension,而Visual Studio實現different extension

請注意,除了對其他體系結構不可移植的明顯問題外,包括任何行內程序集都會降低性能,因爲編譯器無法分析程序集以確定其是否無副作用,是否可以內聯安全,是否它訪問全球資源,等等。

+0

我不擔心目前的性能,只是打印出來。所以我只能說asm(「代碼的東西」);在我的.c文件 –

+0

http://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-CC,我認爲這個網站是一個更好的例子 –

+0

和這個「http://stackoverflow.com/questions/5131568/using-inline-assembly-in-cc「我想我想知道的關於內聯彙編的一切我現在知道了。 –

2

一些編譯器實現__asm__asm關鍵字作爲擴展的C語言:

__asm__(
    "mov eax, 0x2d\n" 
    "mov ebx, 0\n" 
    "int 0x80\n" 
); 

括號中的代碼將被逐字複製到彙編器的輸入端。有關GCC如何實現此功能的更多文檔可以在here找到。

順便說一句,如果你想改變堆棧指針的值(爲什麼?),你可以做一個行:

__asm__("mov esp, eax"); 
+0

我認爲sp在這裏只是C變量名,與堆棧指針無關。 – hyde

+0

@hyde很可能:)但是,當上下文是「內聯彙編」和「void * sp = eax;」時,請原諒我這個假設:) – 2012-11-03 09:03:55

+0

我現在怎麼稱呼那個功能,並且讓sp =返回? sp = asm(「asm code」); ??? –

1

另一種方法,如果如使用gcc,是先編譯一些很瑣碎的功能,而不優化:

int foo(int a, int b) { 
    return a+(b<<3); 
} 

gcc -S foo.c

,並使用foo.s作爲模板。一個以後可以編譯和 gcc main.c foo.s鏈接這些文件(並且一定要刪除foo.c文件/重命名foo.s到別的)

從那個特定功能可以觀察到,在編譯器把結果和在其中的地址或寄存器中,編譯器將第一個和第二個參數放入。

這比使用讀,寫,clobber列表學習asm-templates稍快。

+0

這是一個很好的建議,但是OP對於想將組裝*放在C源代碼文件中是相當明確的。 – user4815162342

1

你真的需要在你的C源代碼程序中「將」asm源代碼放入Nasm語法中嗎? Fergedit。 LCC也許......如果你想從你的C程序「執行」你的彙編程序...

global getbrk 
section .text 
getbrk: 
    push ebx ; C likes it saved 
    mov eax, 45 ; __NR_brk 
    xor ebx, ebx ; get current break 
    int 80h 
    pop ebx 
    ret 

組裝nasm -f elf getbrk.asm,把sp=getbrk();在C文件,編譯gcc -m32 -O3 -o myprog myprog.c getbrk.o

或者只是sp=sbrk(0);在C程序並跳過asm ...將不會比使用int 80h更方便。 (但那會是多麼有趣?):)

+0

我的問題的空洞點是我沒有/或可能不會在我的c程序中使用sp = sbrk(0);但無論如何感謝。我認爲你的解決方案也有效。 –

1
void function(void){ 

    void *sp 
    __asm__ volatile(
    "movl $0x2d, %%eax;" 
    "movl $0, %%ebx;" 
    "int $0x80" 
    :"=a"(sp) 
    : 
    :"%ebx" 
    ); 

    fprintf(stderr, "system break: %p\n",sp); 
    } 

這就是我的回答:)