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 把源儲存...