彙編和 c同步使用

來源:互聯網
上載者:User

一共有三個檔案 makefile foo.asm bar.c

函數調用遵循的是c呼叫慣例,後面的參數先入棧,並由調用者清理堆棧

 

makefile

-------------------

 

.PHONY: all clean

all: foobar

foobar: foo.o bar.o
 ld -s -o foobar foo.o bar.o

foo.o: foo.asm
 nasm -f elf -o foo.o foo.asm

bar.o: bar.c
 gcc -c -o bar.o bar.c

clean:
 rm -f bar.o foo.o foobar

 

foo.asm

-------------------

 

; 編譯連結方法
; (ld 的‘-s’選項意為“strip all”)
;
; [root@XXX XXX]# nasm -f elf foo.asm -o foo.o
; [root@XXX XXX]# gcc -c bar.c -o bar.o
; [root@XXX XXX]# ld -s hello.o bar.o -o foobar
; [root@XXX XXX]# ./foobar
; the 2nd one
; [root@XXX XXX]#

extern choose ; int choose(int a, int b);

[section .data] ; 資料在此

num1st  dd 3
num2nd  dd 4

[section .text] ; 代碼在此

global _start ; 我們必須匯出 _start 這個入口,以便讓連結器識別。
global myprint ; 匯出這個函數為了讓 bar.c 使用

_start:
 push num2nd  ; ┓
 push num1st  ; ┃
 call choose  ; ┣ choose(num1st, num2nd);
 add esp, 4  ; ┛

 mov ebx, 0
 mov eax, 1  ; sys_exit
 int 0x80  ; 系統調用

; void myprint(char* msg, int len)
myprint:
 mov edx, [esp + 8] ; len
 mov ecx, [esp + 4] ; msg
 mov ebx, 1
 mov eax, 4  ; sys_write
 int 0x80  ; 系統調用
 ret
 

bar.c

-------------------------------

 

void myprint(char* msg, int len);

int choose(int a, int b)
{
 if(a >= b){
  myprint("the 1st one/n", 13);
 }
 else{
  myprint("the 2nd one/n", 13);
 }

 return 0;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.