03 ARMv8指令集介紹載入與儲存指令

2022-09-21 15:27:09 字數 2326 閱讀 2156

a64支援全部的大寫或者小寫方式

暫存器命名

ldr xd, [xn, $offset]

【示例】:

【注意】:

【變基模式】:

ldr x6, [x1, #8]!: 將x1裡面的位址增加偏移#8並賦給x1,最後將新的x1暫存器內的位址的值給x6暫存器

ldr x6, [x1], #8: 將x1暫存器內的位址的值賦給x6暫存器,並將x1位址偏移+8。

【偽指令】:

偽指令與指令的最大不同在於,偽指令屬於編譯器處理的範疇,偽指令會被編譯展開為多條指令;指令是cpu處理的命令的最小單元。

從乙個暫存器的值吐到記憶體中,支援立即數和暫存器操作。把xd的值,儲存到[xn|sp]裡面。

immediate-post-index:str xd, [xn|sp], #

immediate-pre-index:str xd, [xn|sp, #]!

mov底層原理實際上是movz,mov 16-bit的立即數到暫存器。

mov xd, #16位立即數

movz xd, #, lsl #16位的立即數,邏輯左移動 16,32,48位

相比於ldr和str指令(8 bytes),ldp和stp指令用於多位元組(16 bytes)操作,

【釋義】:

【練習】:

練習1: 使用ldr和str多位元組載入和儲存命令實現memset()函式,假設記憶體位址s是16位元組對齊,count也是16位元組對齊。例如:memset(0x200000, 0x55, 32)

// memset_a_byte

void *memset_a_byte (void *s, int c)

// 使用str指令,單位元組操作

.global my_memset_test:

my_memset_test:

// 儲存位址s到x1暫存器,儲存c的值到x2暫存器,儲存長度到x3暫存器

mov x1, 0x2000000 // 這個值是需要被修改的 肯定需要stp

mov x2, 0x55 // 這個是個固定的引數

add x0, x1, 32

// 確定原子操作 向位址寫值,然後位址增加

wrt:

str x2, [x1], #8 // 把x2裡面的值儲存到x1裡面(0x55 -> 0x200000),接著0x200008加一

cmp x1, x0

b.cc wrt

ret

// 使用stp指令,雙位元組操作

.global my_memset_test:

my_memset_test:

// 儲存位址s到x1暫存器,儲存c的值到x2暫存器,儲存長度到x3暫存器

mov x1, 0x2000000 // 這個值是需要被修改的 肯定需要stp

mov x2, 0x55 // 這個是個固定的引數

add x0, x1, 32

// 確定原子操作 向位址寫值,然後位址增加

wrt:

stp x2, x2, [x1], #16 // 把x2裡面的值儲存到x1裡面(0x55 -> 0x200000),接著0x200008加一

cmp x1, x0

b.cc wrt

ret

練習二:同上,使用非對齊的memset(0x200004, 0x55, 37)

// 需要彙編和c語言混合程式設計實現對於非16位元組對齊的位址和長度進行memset操作

// 彙編實現乙個16位元組的memset

// c語言用於對非對齊部分進行c語言單位元組的處理,用彙編實現16位元組對齊位址和16位元組對齊長度的處理。

// 函式呼叫為 memset(0x200004, 0x55, 37)

.global asm_memset_16_byte_align:

asm_memset_16_byte_align:

add x4, x0, x2

wrt:

stp x1, x1, [x0], #16

cmp x0, x4

b.cc wrt

retvoid *memset (void *s, int c, int count)

// 對齊部分直接呼叫 asm_memset_16_byte_align(s, c, l);

// 非對齊部分直接c語言指標訪問賦值。

}

ARM指令集和X86指令集的比較

指令的強弱是cpu的重要指標,指令集是提高微處理器效率的最有效工具之一。從現階段的主流體系結構講,指令集可分為複雜指令集 cisc 和精簡指令集 risc 兩部分。相應的,微處理隨著微指令的複雜度也可分為cisc及risc這兩類。cisc 是一種為了便於程式設計和提高記憶體訪問效率的晶元設計體系。在...

SSE3指令集系列

1.資料載入儲存指令 lddquxmm,m128 從非對齊的記憶體位址中載入128位數到xmm暫存器,此條指令比sse2的非對齊載入指令movdqu要快。movddup xmm,xmm m64 載入64bit資料到xmm暫存器的低64位,同時複製到其高64位。movshdup xmm,xmm m12...

SSE2指令集系列之二

本小結描述的是sse2整數運算指令。5.資料搬移指令 movdqa xmm,xmm m128 movdqa xmm m128,xmm 把源儲存器內容值送入目的暫存器,當有m128時,記憶體位址必須16位元組對齊.movdqu xmm,xmm m128 movdqu xmm m128,xmm 把源儲存...