簡體   English   中英

將值從寄存器存儲到 memory、ARM 32 位的問題

[英]Problem to store value ​from register into memory, ARM 32 bit

我是 ARM 和匯編程序的新手。 我試圖編寫一個簡單的程序來將值從寄存器存儲到 memory。

string:
        .ascii "%d\012\000"
        .align 2

var1:
        .word 0
        .align 4

.text
.global main

main:
        push {ip, lr}
        ldr r1, adr_var1
        ldrb r1, [r1]
        mov r1, #370
        uxtb r3, r1
        ldr r1, adr_var1
        strb r3, [r1]
        ldr r0, adr_string
        mov r1, r3
        bl printf
        mov r1, #0
        mov r7, #1
        pop {ip, pc}

adr_var1:
        .word var1

adr_string:
        .word string

將數據寫入 memory 時出現此問題。 當它嘗試寫入值 370(十六進制:0x172)時,僅保存 0x72。 STR 似乎只傳輸 8 個數據位。 我用 STR 指令(例如,STRB)嘗試了不同的配置,但沒有任何效果。 我的問題是如何將此值存儲到 memory。

感謝您的任何幫助和回答。

strb r3, [r1]是一個字節存儲。 當然它只存儲一個字節。

uxtb r3, r1將一個字節零擴展到寄存器中,因此str r3, [r1]字存儲將存儲 4 個字節,高 3 個字節全為零。 嘗試將 memory 中的初始值設為0xFFFFFFFF ,這樣您就可以看到存儲字節和存儲零擴展字之間的區別。

如果您想存儲完整的370 ,只需在存儲之前不要將其截斷為 8 位!

此外,您應該將.align放在var1: label (和.word 0 )。 .align在其位置擴展為填充; 如果您希望var1對齊,那么您必須首先到達 alignment 邊界。


此外,使用調試器檢查寄存器和 memory 作為單步操作。 很明顯,您的370uxtb (無符號擴展字節)截斷為(uint8_t)370

另外,您的代碼不會打印 memory 中的單詞,它只會將r3傳遞給 printf。 因此,您看不到保留高位字節未修改的字節存儲與帶有錯誤調試打印的字存儲之間的區別。 使用調試器要好得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM