ARMv7-MのNOP命令について。
バイナリパッチを作るのに必要なので調べました。
NOP命令は"No Operation" 何もしない命令です。
ARMv7-MのNOP
ARMv7-M には 2種類のNOP命令 NOPとNOP.wがある。 どう使い分けるかは不明です。
-
NOP
-
opcode: 0xbf00
-
NOP.w
-
opcode: 0xf3af 0x8000
バイナリ書き換え例
cortex m3用のバイナリの
00002a0 2b 68 98 47 bd e8 f0 81 ff f7 fe ff bc e7 23 68
1f8: f7ff fffe bl 0 <SdrControllerInit>
をNOPに書き換えてみた。
00002a0 2b 68 98 47 bd e8 f0 81 00 bf 00 bf bc e7 23 68
1f8: bf00 nop
1fa: bf00 nop
同様にNOP.wに書き換えてみた。
00002a0 2b 68 98 47 bd e8 f0 81 af f3 00 80 bc e7 23 68
1f8: f3af 8000 nop.w
ディスアセンブルは以下のコマンドで取得
arm-none-eabi-objdump -d hoge.o
でも、上記NOPとNOP.wだと期待した動作にならず mov r8, r8にしたら動いた。なんでだろ。
00002a0 2b 68 98 47 bd e8 f0 81 c0 46 c0 46 bc e7 23 68
1f8: 46c0 nop ; (mov r8, r8)
1fa: 46c0 nop ; (mov r8, r8)
参考
- ARMv7-M Architecture Reference Manual
- NOP for Iphone Binaries
- http://everything.explained.today/NOP/