命令の違いは基本的な機能の違いではなくデータの受け渡し方の違い。
ESTR* | 文字列の長さを指定する |
---|---|
ISTR* | NULで文字列の終端を表す |
*STRI | インデックスを返す |
---|---|
*STRM | マスクを返す |
*str○ | ○=a/c/o/s/z フラグを戻り値として返す |
何をするかはimm8のビット3:2で指定する。
imm8 bit3:2 | モード | 機能 |
---|---|---|
00 | Equal Any | 文字(複数)が文字列に含まれるか調べる |
01 | Ranges | 範囲内の文字(複数)が文字列に含まれるか調べる |
10 | Equal Each | 文字列を比較する |
11 | Equal Ordered | 文字列が文字列に含まれるか調べる |
文字の形式はimm8のビット1:0で指定する。
imm8 bit1:0 | 文字の形式 |
---|---|
00 | 符号なしBYTE |
01 | 符号なしWORD |
10 | 符号つきBYTE |
11 | 符号つきWORD |
文字列は下位側から指定文字数またはNULの直前までが有効データ、それより上位側は無効データとして扱われる。(下位側が文字列の頭)
ESTR*のバイト/ワード数は指定した値の絶対値が使われる。絶対値が16(BYTE)/8(WORD)より大きい場合は16/8として扱われる。
ISTR*ではNUL自身は無効データとして扱われる。NULがないときは16バイト/8ワード全部が有効データになる。
16/8ビットのIntRes1の各ビットについて以下の操作を行いIntRes2を生成
imm8 bit5:4 | 名前 | 処理内容 |
---|---|---|
00 | Positive Polarity(+) | IntRes1をそのままIntRes2にする |
01 | Negative Polarity(-) | IntRes1を全ビット反転してIntRes2にする |
10 | Masked(+) | IntRes1をそのままIntRes2にする |
11 | Masked(-) | ②xmm2/m128 b 側のBYTE/WORDが 有効データならIntRes1の対応するビットを反転してIntRes2にする 無効データならIntRes1の対応するビットをそのままIntRes2にする |
*STRI命令はECX/RCXレジスタ(int型戻り値)にインデックス(0~15(BYTE)/0~7(WORD))を返す。立っているビットがないときは16/8が返される
imm8 bit6 | 返される値 |
---|---|
0 | IntRes2の一番右(LSB側)の立っているビットの番号 |
1 | IntRes2の一番左(MSB側)の立っているビットの番号 |
*STRM命令はXMM0レジスタ(固定)(__m128i型戻り値)にIntRes2を返す
imm8 bit6 | 返される値 |
---|---|
0 | 最下位16/8ビットにIntRes2を返す |
1 | IntRes2の各ビットをBYTE/WORD(全ビット0または全ビット1)に拡張して返す |
フラグは以下のように設定される
CF | 0 IntRes2が0 1 IntRes2が0以外 |
---|---|
ZF | 0 ②xmm2/m128 b がすべて有効データ 1 ②xmm2/m128 b に無効データが含まれる |
SF | 0 ①xmm1 a がすべて有効データ 1 ①xmm1 a に無効データが含まれる |
OF | IntRes2の最下位ビット |
AF | 0 |
PF | 0 |
*str○はフラグの値(0または1)を返す。
*strc | CF |
---|---|
*strz | ZF |
*strs | SF |
*stro | OF |
*stra | (CF==0 && ZF==0)のとき1 それ以外のとき0を返す |
bit | 値 | 意味 | ||
---|---|---|---|---|
1:0 | 文字タイプ | 00 | 符号なしBYTE | |
01 | 符号なしWORD | |||
10 | 符号つきBYTE | |||
11 | 符号つきWORD | |||
3:2 | モード | 00 | Equal Any | 文字(複数)が文字列に含まれるか調べる |
01 | Ranges | 範囲内の文字(複数)が文字列に含まれるか調べる | ||
10 | Equal Each | 文字列を比較する | ||
11 | Equal Ordered | 文字列が文字列に含まれるか調べる | ||
5:4 | 極性 | 00 | Positive Polarity(+) | IntRes1をそのままIntRes2にする |
01 | Negative Polarity(-) | IntRes1を全ビット反転してIntRes2にする | ||
10 | Masked(+) | IntRes1をそのままIntRes2にする | ||
11 | Masked(-) | ②xmm2/m128 b 側のBYTE/WORDが 有効データならIntRes1の対応するビットを反転してIntRes2にする 無効データならIntRes1の対応するビットをそのままIntRes2にする |
||
6 | 返す値 | 0 | *STRI命令 最下位の立っているビット番号を返す *STRM命令 ビットマスクを返す |
|
1 | *STRI命令 最上位の立っているビット番号を返す *STRM命令 BYTE/WORDマスクを返す |
|||
7 | 未使用 | 0を指定 |
以下のレジスタはオペランドでは指定しないが固定で使われる
レジスタ | 命令 | 意味 |
---|---|---|
EAX/RAX | ESTR* | (IN) オペランド1の長さ |
EDX/RDX | ESTR* | (IN) オペランド2の長さ |
ECX/RCX | *STRI | (OUT) インデックス |
XMM0 | *STRM | (OUT) マスク |