原來的匯程式設計序如下:
.text
main:
addiu $r2,$r0,a
addiu $r3,$r0,b
loop:
lw $r1,0($r2)
add $r1,$r1,$r3
sw $r1,0($r2)
lw $r5,0($r1)
addi $r5,$r5,10
addi $r2,$r2,4
sub $r4,$r3,$r2
bgtz $r4,loop
sll $r0,$r0,0
teq $r0,$r0
sll $r0,$r0,0
sll $r0,$r0,0
.data
a: .word 0, 4, 8
b: .word 2, 1, 0
引導程式後的指令如下:
可以看到:陣列a的元素是從a的起始位置開始的。a為0,4,8。b為2,1,0。這是沒有錯的。
但當我們修改匯程式設計序後,如下:
.text
main:
addiu $r2,$r0,a
#addiu $r3,$r0,b
loop:
lw $r1,0($r2)
add $r1,$r1,$r3
sw $r1,0($r2)
lw $r5,0($r1)
addi $r5,$r5,10
addi $r2,$r2,4
sub $r4,$r3,$r2
bgtz $r4,loop
sll $r0,$r0,0
teq $r0,$r0
sll $r0,$r0,0
sll $r0,$r0,0
.data
a: .word 0, 4, 8
b: .word 2, 1, 0
我所做的修改只是將第4行**注釋掉,使得main後面只有一條指令便又開始有乙個標籤loop了。
這時我們看看引導程式後的指令:
!!!這時我們會很懵b的看到陣列a和陣列b中的元素錯位了,a變成0,0,4了,而b變成8,2,1了。如果不知道這個問題,那麼在運算元組時,會導致很嚴重的錯誤。而且前面的loop標籤也沒有顯示出來。
!!!所以避免這個坑的辦法就是寫程式時,開始要有兩條(以上)的指令再來定義標籤。
ARM匯程式設計序鑑賞 1
area asmembedeedfile code,readonly 定義一段可讀的 區域 export mulcountfunction 輸出函式 mulcountfunction import val 插入變數val mulcountfunction ldr r1,val 取val的暫存器位址,...
匯程式設計序 退出
作為第乙個匯程式設計序,本程式除了退出以外,並沒有執行其他的功能。目的 退出並向linux核心返回乙個狀態碼的簡單程式 輸入 無 輸出 返回乙個狀態碼.在執行程式後可通過輸入echo 來讀取狀態碼 變數 eax儲存系統呼叫號 ebx儲存返回狀態 section data section text g...
微機匯程式設計序
又是自學的一學期,呵呵。學到最後也就知道零星半點指令吧,複雜的程式可能還是不怎麼會寫,熟練當然也不敵c了,但是彙編之於嵌入式,往上走肯定少不了遇到,學好還是必要的!此次僅作入門吧。今日所學,明日之用。1 統計正負零的個數 datas segment array db 1,2,1,0,2,0,2,4,...