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