日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARM汇编指令(1)

發布時間:2024/3/24 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM汇编指令(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

匯編語言是一種功能很強的程序設計語言,也是利用計算機所有硬件特性并能直接控制硬件的語言。目前在嵌入式開發、單片機開發、系統軟件設計、某些快速處理、位處理、訪問硬件設備等高效程序的設計方面有較多應用。
在嵌入式開發中有時候使用匯編,或者混合編程來追求高性能。

在安全領域,逆向工程是也需要用到匯編指令對于底層進行分析等操作。

今天要介紹的是ARM指令,平時做windows逆向用的x86體系的匯編,當涉及安卓逆向時候那么就要用到ARM的匯編了。

先放上ARM指令速查手冊:
鏈接:https://pan.baidu.com/s/1JALdp8YXbESDfkfJjO1QUg?pwd=h7o7
提取碼:h7o7

一、ARM匯編注意事項

1.在ARM匯編中,所有的符號都必須在一行書寫,結尾不用加**’’;"**

2、在ARM匯編程序中,一條ARM指令,偽指令。寄存器名可以全部寫為大寫字母,也可以全部為小寫字母,但是不能大小寫混合編寫使用。

二、數據處理指令

1、數據傳輸指令
mov 把一個寄存器的賦給另一個寄存器,或者將一個常量賦給寄存器(后邊的量賦給前邊的量)。

MOV R6,R5 ;將寄存器R0的值傳送到寄存器R1 MOV PC,R12 ;將寄存器R14的值傳送到PC MOV R1,R0,LSL#2 ;將寄存器R0的值左移3位后傳送到R1(即乘4

2、算術運算指令:ADD、SUB、ADC、RSB、MUL
與X86匯編類似

1、【加法指令】:ADD ADD R0,R1,R2 ; R0 <= R1 + R2 ADD R0,R1,#30 ; R0<= R1 + 30 ADD R0,R2,R3,LSL#2 ; R0 <= R2 + (R3 << 2)2、【帶進位的加法指令】:ADC ADDS R0,R1,R2 ; 加低端的字 ADCS R2,R3,R4 ; 加第二個字,帶進位 ADC R3,R7,R11 ; 加第四個字,帶進位3、【減法指令】:SUB SUB R0,R1,R2 ; R0 <= R1 - R2 SUB R0,R1,#30 ; R0 <= R1 - 30 SUB R0,R2,R3,LSL#2 ; R0 <=R2 - (R3 << 2)8、【乘法指令】:MUL mul R2, R0, R1   ;R2 = R0 * R17、【逆向減法】:RSB RSB r1,r2,r3 ;r1 = r3 - r2

3、邏輯運算指令 AND、ORR、EOR

1、【邏輯與指令】:AND AND R0,R0,#3 ; 保持R0的01位,其余位清零。2、【邏輯或指令】:ORR ORR R0,R0,#3 ; 設置R0的01位,其余位保持不變。3、【邏輯異或指令】:EOR EOR R0,R0,#3 ; 反轉R0的01位,其余位保持不變。

4、比較指令:CMP
與x86匯編也類似

1、【直接比較指令】:CMP CMP R1,R0 ;R1的值和R0的值相減,并根據結果設置CPSR的標志位 CMP R1,#100 ;R1的值與立即數100相減,并根據結果設置CPSR的標志位2、【負數比較指令】:CMN(反向CMP) CMN R1,R0 ;R1的值與R0的值相加,并根據結果設置CPSR的標志位 CMN R1,#100 ;將寄存器R1的值與立即數100相加,并根據結果設置CPSR的標志位

5、跳轉指令 B(L)

1、【B指令】 B Label ;無條件跳轉到標號Label處執行 CMP R1,#0 ;當CPSR中的Z條件碼置位時,跳轉到標號Label處執行 BEQ Label 2、【BL指令】 BL Label ;當程序無條件跳轉到標號Label處執行時,同時將當前的PC值保存到R14中

6 匯編加載 存儲指令: LDR、STR 就是x86的 Load/Store

由存儲器-->寄存器 LDR R0,[R1] ;將存儲器地址為R1的字數據讀入寄存器R0。 LDR R0,[R1,R2] ;將存儲器地址為R1+R2的字數據讀入寄存器R0。 LDR R0,[R1,#8] ;將存儲器地址為R1+8的字數據讀入寄存器R0。 LDR R0,[R1,R2] ! ;將存儲器地址為R1+R2的字數據讀入寄存器R0,并將新地址R1+R2寫入R1。 LDR R0,[R1,#8] ! ;將存儲器地址為R1+8的字數據讀入寄存器R0,并將新地址R1+8寫入R1。 LDR R0,[R1],R2 ;將存儲器地址為R1的字數據讀入寄存器R0,并將新地址R1+R2寫入R1。 LDR R0,[R1,R2,LSL#2]! ;將存儲器地址為R1+R2×4的字數據讀入寄存器R0,并將新地址R1+R2×4寫入R1。 LDR R0,[R1],R2,LSL#2 ;將存儲器地址為R1的字數據讀入寄存器R0,并將新地址R1+R2×4寫入R1。由寄存器-->存儲器 STR R0,[R1],#2 ;將R0中的字數據寫入以R1為地址的存儲器中,并將新地址R1+8寫入R1。 STR R0,[R1,#2] ;將R0中的字數據寫入以R1+8為地址的存儲器中。

條件標志(condition flags)
總共有四個條件標志 N, Z, C, V,A32/T32中可存儲更新到APSR寄存器最高的4個位置。


條件碼(Condition code)

可見arm匯編與X86匯編有許多相似之處,指令方面也有很多一致的,而對于匯編的學習確實大同小異,關鍵在于多看官方文檔,以及想要所實現功能所需的匯編。

總結

以上是生活随笔為你收集整理的ARM汇编指令(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。