用組合語言實現在210實現流水燈
---參考朱有鵬arm裸機程式設計
1、makefile的解釋
(1)首先簡單的解釋一下這個的makefile
目標檔案:led.bin:依賴的檔案led.o
也就是led.bin不存在的時候,或者led.o更新的時候,會執行這個makefile
那麼就執行後面的命令:
第二個命令:使用工具,把led.elf可執行程式轉化為燒錄檔案led.bin
第三個命令:反彙編的命令:把剛才生成的可執行程式led.elf轉化為led_elf.dis
第四個命令:編譯生成mkv210_iamge.c ,得到led_elf.dis
第五個命令:執行可執行程式,把led.bin轉化為210.bin
隱含的命令:把所有的.s檔案轉化為.o 檔案
把所有的.c檔案轉化為.c檔案
clean:清除剛剛生成的多餘的檔案
執行make clean就可以執行這個命令。
makefile裡面規定,直接執行make指令的話,就相當於執行第乙個目標檔案。
其中你可以自己去執行程式當中的其中的目標檔案。
使用make 加上你想生成的目標檔案。
led.bin: led.o
arm-linux-ld -ttext 0x0 -o led.elf $^
arm-linux-objcopy -o binary led.elf led.bin
arm-linux-objdump -d led.elf > led_elf.dis
gcc mkv210_image.c -o mkx210
./mkx210 led.bin 210.bin
%.o : %.s
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis mkx210 -f
2、執行shell的命令
#!/bin/sh
sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1
燒寫到sd卡的命令。
3、mkv210_image.c檔案,裡面主要寫的**是
怎麼把從usb燒錄的**轉化為sd卡啟動的**,
在以前的文章中已經詳細的講過
4、主程式led.s
下面的重點
(1)在組合語言中怎麼寫延時函式
(2)在組合語言中怎麼寫死迴圈程式
(3)組合語言中的開始的標號_start
需要宣告為.global,不然的話,gcc編譯會出現乙個警告。要把他申明為外部的全域性型別的標號
所有的標號都是代表乙個位址。
#define gpj0con 0xe0200240
#define gpj0dat 0xe0200244
.global _start // 把_start鏈結屬性改為外部,這樣其他檔案就可以看見_start了
_start:
// 第一步:把所有引腳都設定為輸出模式,**不變
ldr r0, =0x11111111 // 從後面的=可以看出用的是ldr偽指令,因為需要編譯器來判斷這個數
ldr r1, =gpj0con // 是合法立即數還是非法立即數。一般寫**都用ldr偽指令
str r0, [r1] // 暫存器間接定址。功能是把r0中的數寫入到r1中的數為位址的記憶體中去
// 要實現流水燈,只要在主迴圈中實現1圈的流水顯示效果即可
flash:
// 第1步:點亮led1,其他熄滅
//ldr r0, =((0<<3) | (1<<4) | (1<<5)) // 清清楚楚的看到哪個滅,哪個是亮
ldr r0, =~(1<<3)
ldr r1, =gpj0dat
str r0, [r1] // 把0寫入到gpj0dat暫存器中,引腳即輸出低電平,led點亮
// 然後延時
bl delay // 使用bl進行函式呼叫
// 第2步:點亮led2,其他熄滅
ldr r0, =~(1<<4)
ldr r1, =gpj0dat
str r0, [r1] // 把0寫入到gpj0dat暫存器中,引腳即輸出低電平,led點亮
// 然後延時
bl delay // 使用bl進行函式呼叫
// 第3步:點亮led3,其他熄滅
ldr r0, =~(1<<5)
ldr r1, =gpj0dat
str r0, [r1] // 把0寫入到gpj0dat暫存器中,引腳即輸出低電平,led點亮
// 然後延時
bl delay // 使用bl進行函式呼叫
b flash
// 延時函式:函式名:delay
delay:
ldr r2, =9000000
ldr r3, =0x0
delay_loop:
sub r2, r2, #1 //r2 = r2 -1
cmp r2, r3 // cmp會影響z標誌位,如果r2等於r3則z=1,下一句中eq就會成立
bne delay_loop
mov pc, lr // 函式呼叫返回
組合語言實現階乘
static int fact int n return fact n 1 n public static void main string args 開始遞迴函式呼叫 addiu sp,0,0x10010080 初始化棧位址 壓棧入參 addiu s0,0,5 n 5 sw s0,0 sp n 5...
用組合語言實現BCH解碼校驗演算法
資料傳輸通訊中,常常因傳輸差錯造成誤碼錯碼,尤其在無線通訊中,空中的突發或隨機干擾雜訊會造成編碼差錯。為了提高傳輸的正確率,往往採用一些校驗方法,以檢驗糾正傳輸差錯。通訊中校驗的方法很多,其中的bch編碼有其獨特的優點 不僅可以檢糾突發差錯,還能檢糾隨機差錯,被廣泛地採用在微機級的通訊中。但對更低層...
用組合語言實現氣泡排序 基於MIPS指令系統
這是計組第乙個小實驗,實現從鍵盤輸入十個數字,並把它們按從大到小排序輸出。氣泡排序流程圖 c語言實現氣泡排序 void swap int a,int k void sort int a,int n data sortarray space 40 separate asciiz line asciiz...