c 語言呼叫純彙編函式 1

2021-08-15 01:45:02 字數 2404 閱讀 3291

原始碼位址
/* mainprog.c - an example of calling an assembly function
這裡用的是 professional assembly language 原始碼

我的環境 gcc version 7.2.0 (ubuntu 7.2.0-8ubuntu3)

我改了原始碼 把所有32位暫存器全改這64位。 同時 指令後輟改為q  

1。原始碼的第乙個坑 在c 檔案裡要加extern int asmfunc(); 

2。第二個坑 直接 gcc -o a.out ***x.s ******.c

報:allenboy@allenboy:~/桌面$ gcc -static -o allen mainprog.c asmfunc.s

allenboy@allenboy:~/桌面$ gcc -o allen mainprog.c asmfunc.s

/usr/bin/ld: /tmp/cc1qssmy.o: relocation r_x86_64_32s against `.data' can not be used when ****** a shared object; recompile with -fpic

加上gcc -fpic -o allen mainprog.c asmfunc.s

報:一樣的錯誤

allenboy@allenboy:~/桌面$ gcc -fpic -o allen mainprog.c asmfunc.s

/usr/bin/ld: /tmp/cc5b1l8q.o: relocation r_x86_64_32s against `.data' can not be used when ****** a shared object; recompile with -fpic

/usr/bin/ld: 最後的鏈結失敗: 輸出不可表示的節

collect2: error: ld returned 1 exit status

這個坑一直沒解決 (對gcc不太了解)

這裡解決辦法是他報不能生成動態庫 ,我強制生成靜態的編譯通過

allenboy@allenboy:~/桌面$ gcc -static -o allen mainprog.c asmfunc.s

allenboy@allenboy:~/桌面$ ls

code main3.cpp main8.c 美河製作.組合語言程式設計(jb51.net).pdf

ida main4.c main9.c

allenboy@allenboy:~/桌面$ ./allen

this is a test.

this is a test message from the asm function

now for the second time.

this is a test message from the asm function

this completes the test.

*/#include extern int asmfunc();

int main()

# asmfunc.s - an example of a ****** assembly language function

#.file "asmfunc.c"

.section .data

testdata:

.ascii "this is a test message from the asm function\n"

datasize:

.int 45

.section .text

.type asmfunc, @function

.globl asmfunc

asmfunc:

pushq %rbp

movq %rsp, %rbp

pushq %rbx

movq $4, %rax

movq $1, %rbx

movq $testdata, %rcx

movq datasize, %rdx

int $0x80

popq %rbx

movq %rbp, %rsp

popq %rbp

ret

c呼叫彙編函式 1

guang guang laptop temp h ls hello hello.o hello.s main.c main.o hello.s.global hello hello movl 4,eax movl 1,ebx movl hello,ecx movl 30,edx int 0x80 ...

C語言彙編 函式呼叫棧

函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的 最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢?對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為 段,資料段,堆,棧 段 儲存程式文字,指令指標eip...

彙編呼叫 C 語言問題

ld 當搜尋用於 usr lib x86 64 linux gnu libc.so 時跳過不相容的 lc ld 當搜尋用於 usr lib x86 64 linux gnu libc.a 時跳過不相容的 lc ld 找不到 lc使用的鏈結命令為 ld m elf i386 dynamic linke...