ARM架構的機器碼和匯編指令互相轉換


因為項目的一些需求,需要查看一些匯編指令對應的機器碼是什么,也需要查看一些機器碼對應的匯編指令是啥,經過網上查找的一些資料,找到了一個比較輕量、方便、快捷的方法。

首先第一步需要配置arm-linux-gcc交叉編譯環境;第二步將需要轉換的機器碼或者匯編指令寫到一個.s文件中;第三步使用as和objdump命令進行編譯和反匯編;最后你就得到了你要的結果。

1. 配置arm-linux-gcc環境

sudo apt-get install gcc-arm-linux-gnueabi   //安裝
arm-linux-gnueabi-gcc -v  //檢查是否安裝成功

2. 寫一個.s文件,如下的test.s

可以使用正確的匯編指令,也可以使用偽指令的形式。

以下第一句是將0x100A700這個值放到pc中;第二句將立即數0放到寄存器R0中;第三句相當於RET。

如果是將機器碼轉換為匯編指令,文件中的機器碼前要加.inst,並且如果是小端的機器碼的話,需要將其轉換為大端的形式,因為實驗表明gcc可能是大端的。

3. 使用as和objdump進行編譯和反匯編

as編譯生成目標文件test.o,再將test.o反匯編輸出如下。

左右對照機器碼和匯編指令,注意這里的機器碼是大端形式,匯編指令是正確的,not偽指令了。

第一句偽指令變成了兩句匯編指令,數據部分放在了最后,然后將該數據對應的地址賦給pc。

第二句匯編指令對應的機器碼就是e3a00000(大端),0000a0e3(小端)。

第四句的機器碼對應的匯編指令就是 ldr pc,[pc,#-4] 。

 

附加一些在線轉換工具:

Online Assembler and Disassembler【多種架構】:http://shell-storm.org/online/Online-Assembler-and-Disassembler/?opcodes=%5Cx04%5Cxf0%5Cx1f%5Cxe5&arch=arm&endianness=little&dis_with_addr=True&dis_with_raw=True&dis_with_ins=True#disassembly

Online x86 / x64 Assembler and Disassembler【僅x86/x64】:https://defuse.ca/online-x86-assembler.htm#disassembly

Online ARM to HEX Converter【ARM,部分指令,僅可單向轉換】:https://armconverter.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM