c程式呼叫彙編函式

2021-08-07 17:13:27 字數 2170 閱讀 9494

c程式呼叫彙編函式

程式例項:按鍵控制led燈

/************************* main.c **************************/

static int (*printf)(const char *format,...) = (int (*)(const char *format,...))0xc3e11ad0

void _start() }

/************************* led_key.s **************************/

#define gpm4con 0x110002e0

#define gpm4dat 0x110002e4

#define gpx3con 0x11000c60

#define gpx3dat 0x11000c64

.global led_init

led_init:

//gpm4_0~3設為輸出

//gpm4con = (gpm4con & ~0xffff) | 0x1111led_init:

ldr r0 , =gpm4con

ldr r1 , [r0]

bic r1 , #0xff

bic r1 , #0xff00 //0xffff 0x1111都是非法立即數,兩種方法,拆開立即數或用偽指令

ldr r2 , #0x1111

orr r1 , r2

str r1 , [r0]

mov pc , lr

.global key_init

key_init:

//gpx3_2~5設為輸入

//gpx3con &= ~(0xffff<<8)

ldr r0 , =gpx3con

ldr r1 , [r0]

bic r1 , #(0xff<<8)

bic r1 , #(0xff00<<8)

ldr r2 , #0x1111

str r1 , [r0]

mov pc , lr

.global key_stat

key_stat:

ldr r0 , =gpm3dat

ldrb r1 , [r0]

mov r1 , r1 , lsr #2

and r1 , #0xf

mov r0 , r1 //將按鍵狀態stat通過r0傳給led_on函式,彙編中函式的返回值是通過r0來傳遞

mov pc , lr

.global led_on

led_on:

//點亮led

//gpm4dat = (gpm4dat & ~0xf) | (stat & 0xf)

ldr r2 , r0 //將函式唯一的引數stat轉移到r2裡

ldr r0 , =gpm4dat

ldrb r1 , [r0]

bic r1 , 0xf

orr r1 , r2 //點燈

strb r1 , [r0]

mov pc , lr

/************************* makefile **************************/

tgt := boot.o

objs := led_key.o

objc := main.o

cross_compiler := arm-linux-

cc := $(cross_compiler)gcc

objcopy := $(cross_compiler)objcopy

cflags := -ffreestanding

ldflags : -static -nostartfiles -ttext=0x40000000

all:

$(cc) $(cflags) -c $(objc:.o=.s) $(objc:.o=.c)#替換字尾,編譯生成a.out

$(cc) $(ldflags) $(objc) $(objs) #鏈結,_start在哪個檔案裡哪個檔案鏈結就放前面

$(objcopy) -o binary a.out $(tgt:.o=.bin)

clean:

$(rm) a.out $(objc) $(tgt:.o=.bin)

在C程式中呼叫彙編函式

在趙炯的 linux核心完全剖析 中有乙個在c程式中呼叫彙編函式的介紹 執行as o callee.o callee.s的時候遇到錯誤 callee.s 7 error invalid instruction suffix for push 參考文章 感謝作者 在callee.s中加入 code32...

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 ...

ARM彙編程式設計之C程式呼叫匯程式設計序

編寫乙個彙編子程式,實現兩個字資料的加法運算,編寫乙個c程式來呼叫該彙編子程式,並將運算結果使用printf 函式顯示出來。示例如下 為解決這個問題,分別編寫滿足需求的c程式和匯程式設計序。c程式源 define uint32 unsigned int extern uint32 add uint3...