我對 ARM 程式集很陌生,我想了解使用STUR. 舉個例子,這里是 64 位
0000 0000 0000 0000 0000
0000 0000 0000 0000 0000
0000 0000 0000 0000 0000
0000
現在當我打電話
STUR X0, [X29,#var_8] ; Store the value of X0 (0xB) into the stack at offset 0x8
變成?
0000 0000 1011 0000 0000
0000 0000 0000 0000 0000
0000 0000 0000 0000 0000
0000
或者
0000 0000 0000 0000 0000
0000 0000 0000 0000 0000
0000 0000 0000 1011 0000
0000
uj5u.com熱心網友回復:
記憶體是位元組可尋址的。因此,描述記憶體的最佳方式是用地址標記并顯示位元組值。通常這是用十六進制完成的,但我想二進制也可以。
Address Value
10010000 00
10010001 44
10010002 33
10010003 55
...
有時一行顯示多個位元組,只有一個地址號:
Address Value
10010000 00 44 33 55
10010004 ...
...
地址對于理解記憶體如何作業很重要。
0000 0000 1011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
在十六進制和分組為位元組是 00 B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00
這個值,用小端法解釋為 64 位數字是 45056(十進制)。
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1011 0000 0000
在十六進制和分組為位元組是 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 00
上面的值,在 little endian 中解釋為 64 位數字是 2816(十進制)。
因此,您問題的答案都不是,存盤的值將是
B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
因為這是小端位元組序的位元組序列,其值為 0xB,也就是x0.
需要明確的是,ARM 處理器也可以作為 big-endian 運行,但這似乎并不常見。
偏移量非常重要,因為它會更改x0寫入值的地址。
偏移量被添加到基址暫存器(這里是 x29)以形成所謂的有效地址,它決定了第一個位元組將被寫入的地址。記憶體中的多位元組專案由位元組中的最低地址參考——正是這個地址與記憶體系統通信(以及指示記憶體傳輸大小和方向的控制信號,這里是 16 位元組/64 -位并寫入記憶體)。
寫入記憶體的值仍然是 16 個位元組,因此更新 16 個不同的連續地址的記憶體位元組。位元組將根據 little endian 位元組順序以記憶體順序出現。
可以使用 16 位元組/64 位讀取從記憶體中讀取該值,這將在 CPU 暫存器中獲得值 0x00..000B。該記憶體位置的讀取不必在偏移量中匹配,只有有效地址需要是相同的位置才能參考相同的專案,并且任何會生成相同有效地址的尋址模式都可以讀取該值
例如,如果堆疊指標從將更多的東西推入堆疊中移動——堆疊指標在推入時向下移動到更小的值,以容納額外的專案(已經在堆疊上的東西保持它們在地址方面的位置)——然后當使用堆疊指標作為基址時,偏移量需要增加以參考與在將其他專案壓入堆疊之前寫入的相同有效地址;增加的數量需要與推送的專案大小完全匹配,以保持有效地址相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/381522.html
