一、介紹
ARMv8 體系結構最大的改變是增加了一個新的 64 位的指令集,這是早前 ARM 指令集
的有益補充和增強。它可以處理 64 位寬的寄存器和數據并且使用 64 位的指針來訪問內存。這
個新的指令集稱為 A64 指令集,運行在 AArch64 狀態。 ARMv8 兼容舊的 32 位指令集——A32
指令集,它運行在 AArch32 狀態。注意:A64 指令集的指令寬度是 32 位,而不是 64 位。
?
二、分類
A64 指令集可以分成如下幾類:
- ? 內存加載和存儲指令;
- ? 多字節內存加載和存儲指令;
- ? 算術和移位指令;
- ? 移位操作指令;
- ? 位操作指令;
- ? 條件操作指令;
- ? 跳轉指令;
- ? 獨占訪存指令;
- ? 內存屏障指令;
- ? 異常處理指令
A64 指令匯編需要注意的地方如下:
?A64 支持指令助記符和寄存器名全是大寫字母或者全是小寫字母的書寫方式。不過,程序和數據標簽是區分大小寫的。
?在使用立即操作數時前面可以使用“#”或者不使用“#”。
? 通用寄存器前面使用“w”表示僅使用通用寄存器的低 32 位,“x”表示 64 位通用寄存器。
三、A64 指令編碼格式
A64 指令集中每條指令的寬度為 32 位, 其中第 24~28 位用來識別指令的分類, 如圖 3.1 所示。
表中, x 表示該位可以是 1 或者 0。以加載與存儲指令為例,第 25 位必須為 0,第 27 位為
1,其他 3 位可以是 0 或者 1。
當根據 op0 字段確定了指令的分類之后,還需要進一步確定指令的細分類別。以加載與存
儲指令為例,加載與存儲指令的格式如圖 3.2 所示。
如圖 3.2 所示,加載與存儲指令格式可以細分為 op0、 op1、 op2、 op3 以及 op4 這幾個字段。
這些字段不同的編碼又可以對加載與存儲指令繼續細分,如表 3.2 所示
?為什么指令的編碼寬度只有 32 位?
因為 A64 指令集基于寄存器加載和存儲的體系結構設計,編碼寬度32位足夠了。使用op1+op2字段,一共五位。在指令編碼中使用 該5 位寬,這樣一共可以索引 32(25 = 32)個通用寄存器。ARM64 一共有 31 個通用寄存器,即 X0~X30,另外,在下面的條件下,我們還可以描述第 31 個寄存器。
- ? 當使用寄存器作為基地址時,把 SP(棧指針)寄存器當作第 31 個通用寄存器。
- ? 當用作源寄存器操作數時,把 XZR 當作第 31 個通用寄存器
?
四、具體的指令
MOV:數據傳送指令,將一個寄存器的值復制到另一個寄存器。
?? ?MOV R0, R1 ; 將R1的值復制到R0
LDR:從內存加載數據到寄存器
?? ?LDR R0, [R1] ; 將R1指向的內存地址中的值加載到R0
算術運算指令
ADD:加法指令,將兩個寄存器的值相加,結果存入第三個寄存器。
?? ?ADD R0, R1, R2 ; R0 = R1 + R2
SUB:減法指令,從一個寄存器中減去另一個寄存器的值,結果存入第三個寄存器。
?? ?SUB R0, R1, R2 ; R0 = R1 - R2
?BIC: 指定位清零指令
????????? BIC{S}<c> <Rd>, <Rn>, #<const>;將rn中的字數據const為1的比特清零,把結果放入rd?? ?
orr:? 指定位置位指令:
????????ORR{S}<c> <Rd>, <Rn>, #<const>
S后綴
匯編指令的s后綴,幾乎所有的匯編指令都可以在指令后面加上s后綴,s后綴的含義是在指令執行過程中會更新cpsr寄存器的N,V,C,Z位
N:在結果是有符號的二進制補碼情況下,如果結果為負數,則N=1;如果結果為非負數,則N=0
Z:如果結果為0,則Z=1;如果結果為非零,否則Z=0
C:是針對無符號數最高有效位向更高位進位時C=1;減法中運算結果的最高有效位從更高位借位時C=0
V:該位是針對有符號數的操作,會在下面兩種情形變為1,兩個最高有效位均為0的數相加,得到的結果最高有效位為1;兩個最高有效位均為1的數相加,得到的結果最高有效位為0;除了這兩種情況以外V位為0
?
參考:
參考:
ARM匯編指令_arm指令-CSDN博客
ARM指令集詳解-CSDN博客
匯編指令入門級整理-CSDN博客
ARM全匯編指令(詳細)整理附實例快速掌握_arm指令集-CSDN博客