bamboo’s blog

Bambooの気まぐれブログ

Armでのnopの扱い

 Armにはnopという「何もしない命令」が存在する。これは主に以下のような用途で使用される。

  • 遅延処理
  • 別の命令のダミー
  • 命令のパディング

上記はあくまで一例であり、他にも用途は様々。 こんなnopだが、すべてのバージョンで同じようにnopを扱えるわけではない。

疑似命令として

 従来のアセンブラではnopは疑似命令として扱われており、専用の命令が存在していなかった。ArmモードとThumbモードで扱いが異なり、以下のように変換される。

モード 16進表現 意味
Arm 0xE1A00000 mov r0, r0
Thumb 0x46C0 mov r8, r8

どちらも「同じレジスタに値をコピーする」という処理になるため、当然何も更新されない。

専用命令として

 ArmにはARMv6Kから、ThumbにはARMv6T2から、「nop命令」というnop専用の命令が登場する。命令は以下の通り。

モード 16進表現
Arm 0xE320F000
16-bit Thumb 0xBF00
32-bit Thumb 0x8000F3AF

※対応バージョン以外では、これらの16進表現はnopの意味を成さないので注意。