用組合語言實現在210實現流水燈

2021-08-09 15:52:20 字數 2745 閱讀 6578

用組合語言實現在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...