因為項目的一些需求,需要查看一些匯編指令對應的機器碼是什么,也需要查看一些機器碼對應的匯編指令是啥,經過網上查找的一些資料,找到了一個比較輕量、方便、快捷的方法。
首先第一步需要配置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/