0から作るソフトウェア開発

日々勉強中。。。

0から作るOS開発

環境準備

環境設定

ブートローダ

カーネルローダ

GRUB

カーネル

ドライバーその他

Tips IA32(x86)汎用命令一覧 Rから始まる命令 REP/REPE/REPZ/REPNE/REPNZ命令

IA32(x86)汎用命令一覧

このサイトで挙げる命令は汎用命令の一覧となります

調べたい命令の頭文字をクリックすると、表の下に詳細が表示されます
IA32(x86)汎用命令一覧
A B C D E F G H
I J K L M N O P
Q R S T U V W X
Y Z 補足


Rから始まる命令

クリックすると、表の下に詳細が表示されます
Rから始まる命令一覧
命令 代表命令の説明
(英語)
代表命令の説明
(日本語)
RCL/RCR Rotate thru Carry CFビットをローテート(回転)する
RDMSR Read from Model-Specific Register 64ビットのモデル固有レジスタ(MSR)からデータをロードする
RDPMC Read Performance-Monitoring Counters 性能モニタリングカウンタをロードする
RDTSC Read Time-Stamp Counter タイムスタンプカウンタをロードする
REP/REPE/REPZ/REPNE/REPNZ Repeat String Operation Prefix カウンタレジスタ(ECXまたはCX)に指定された回数か、ZFフラグの条件が満たされるまで命令を繰り返す
RET Return from Procedure 関数からの復帰
ROL/ROR Rotate ビットをローテート(回転)する
RSM Resume from System Management Mode 割り込まれたプログラムの動作を再開する


REP/REPE/REPZ/REPNE/REPNZ命令(Repeat String Operation Prefix)

REP/REPE/REPZ/REPNE/REPNZ命令
オペコード 命令 説明
0xF3 0x6C REP INS m8, DX (E)CXのバイトをポートDXからES:[(E)DI]に入力します
0xF3 0x6D REP INS m16, DX (E)CXのワードをポートDXからES:[(E)DI]に入力します
0xF3 0x6D REP INS m32, DX (E)CXのダブルワードをポートDXからES:[(E)DI]に入力します
0xF3 0xA4 REP MOVS m8, m8 (E)CXのバイトをDS:[(E)SI]からES:[(E)DI]に転送します
0xF3 0xA5 REP MOVS m16, m16 (E)CXのワードをDS:[(E)SI]からES:[(E)DI]に転送します
0xF3 0xA5 REP MOVS m32, m32 (E)CXのダブルワードをDS:[(E)SI]からES:[(E)DI]に転送します
0xF3 0x6E REP OUTS DX, r/m8 (E)CXのバイトをDS:[(E)SI]からポートDXに出力します
0xF3 0x6F REP OUTS DX, r/m16 (E)CXのワードをDS:[(E)SI]からポートDXに出力します
0xF3 0x6F REP OUTS DX, r/m32 (E)CXのダブルワードをDS:[(E)SI]からポートDXに出力します
0xF3 0xAC REP LODS AL (E)CXのバイトをDS:[(E)SI]からALにロードします
0xF3 0xAD REP LODS AX (E)CXのワードをDS:[(E)SI]からAXにロードします
0xF3 0xAD REP LODS EAX (E)CXのダブルワードをDS:[(E)SI]からEAXにロードします
0xF3 0xAA REPE STOS m8 ES:[(E)DI]にある(E)CXのバイトをALで埋めます
0xF3 0xAB REPE STOS m16 ES:[(E)DI]にある(E)CXのワードをAXで埋めます
0xF3 0xAB REPE STOS m32 ES:[(E)DI]にある(E)CXのダブルワードをEAXで埋めます
0xF3 0xA6 REPE CMPS m8, m8 ES:[(E)DI]とDS:[(E)SI]にある、一致していないバイトを探します
0xF3 0xA7 REPE CMPS m16, m16 ES:[(E)DI]とDS:[(E)SI]にある、一致していないワードを探します
0xF3 0xA7 REPE CMPS m32, m32 ES:[(E)DI]とDS:[(E)SI]にある、一致していないダブルワードを探します
0xF3 0xAE REPE SCAS m8 ES:[(E)DI]で始まるALでないバイトを探します
0xF3 0xAF REPE SCAS m16 ES:[(E)DI]で始まるAXでないワードを探します
0xF3 0xAF REPE SCAS m32 ES:[(E)DI]で始まるEAXでないダブルワードを探します
0xF2 0xA6 REPNE CMPS m8, m8 ES:[(E)DI]とDS:[(E)SI]にある、一致しているバイトを探します
0xF2 0xA7 REPNE CMPS m16, m16 ES:[(E)DI]とDS:[(E)SI]にある、一致しているワードを探します
0xF2 0xA7 REPNE CMPS m32, m32 ES:[(E)DI]とDS:[(E)SI]にある、一致しているダブルワードを探します
0xF2 0xAE REPNE SCAS m8 ES:[(E)DI]で始まるALを探します
0xF2 0xAF REPNE SCAS m16 ES:[(E)DI]で始まるAXを探します
0xF2 0xAF REPNE SCAS m32 ES:[(E)DI]で始まるEAXを探します


詳細

カウンタレジスタ((E)CX)に指定されている回数か、またはZFフラグの指定された条件が満たされなくなるまで、

ストリング命令を繰り返します。REP(リピート)、REPE(等しい間はリピート)、REPNE(等しくない間はリピート)、

REPZ(ゼロの間はリピート)、REPNZ(ゼロでない間はリピート)の各ニーモニックは、ストリング命令の1つに

付加できるプリフィクスです。REPプリフィクスは、 INS、 OUTS、 MOVS、 LODS、 STOS命令に

付加することができ、REPE、REPNE、REPZ、REPNZプリフィクスは CMPS、 SCAS命令に付加することができます

(REPZ、REPNZプリフィクスは、それぞれREPE、REPNEプリフィクスの同義語です)。

非ストリング命令に使用すると、REPプリフィクスの行動は未定義となります



REPプリフィクスは、一度に1つのストリング命令だけに適用できます。命令ブロックを繰り返すには、LOOP命令

またはその他のループ構造体を使用します。



全てのリピートプリフィクスは(E)CXのカウントが0になるまでデクリメントされ、付加した命令を繰返します

(下記表を参照してください)。現在のアドレスサイズ属性が32である場合ECXがカウンタとして使用され、

アドレスサイズ属性が16である場合CXがカウンタとして使用されます。REPE、REPNE、REPZ、REPNZプリフィクスも、

各リピート後にZFフラグの状態をチェックし、ZFフラグが指定された状態になればリピートを終了します

両方の終了条件がテストされるときは、リピートの終了の原因は、JECXZ命令での

(E)CXレジスタのテストまたは JZ、 JNZ、 JNE命令でのZFのテストによって判断することができます

リピートの終了条件
リピートプリフィクス 終了条件1 終了条件2
REP ECX=0 なし
REPE/REPZ ECX=0 ZF=0
REPNE/REPNZ ECX=0 ZF=1


REPE/REPZ/REPNE/REPNZプリフィクスを使用すると、CMPS命令SCAS命令の両方が

行う比較の結果に従ってZFフラグに影響を与えますので、ZFフラグを初期化剃る必要はありません

リピートストリング操作は、例外または割り込みによって中断されることがあります。この場合でも、レジスタの状態は

例外・割り込みハンドラからのリターン時にストリング操作を再開できるように保たれています。読み込み元レジスタ、

格納先レジスタは操作する次のストリング要素を指し、EIPはストリング命令を指しています。また、ECXは命令の

最後の正常なリピートの後に保持していた値を持っています。これによって、システムの割り込み応答時間に影響を

与えずに、長いストリング操作を行うことができます



REPE/REPNEプリフィクスのついたCMPS命令SCAS命令の実行中にフォルトが発生すると、EFLAGSの値は

命令の実行前の状態に復元されます。 CMPS命令SCAS命令はEFLAGSを入力として使用できないので、プロセッサはページフォルトハンドラの

後に命令を再開することができます



REP INS命令とREP OUTS命令は、注意して使用する必要があります。これらの命令が実行するレートを

処理できないI/Oポートもあります



REP STOS命令は、大きいメモリブロックを初期化する最も速い方法となります

影響のあるEFLAGSレジスタのフラグ

CMPS命令SCAS命令はEFLAGSのステータスフラグを設定します

影響のあるフラグについては各命令の詳細を参照してください

影響のあるEFLAGSレジスタのフラグ
フラグ 説明
ID -
VIP -
VIF -
AC -
VM -
RF -
NT -
IOPL -
OF -
DF -
IF -
TF -
SF -
ZF -
AF -
PF -
CF -


inserted by FC2 system