1

x86命令のシンボリック解釈を行っています。たとえば cmp 命令の場合、比較の符号とオペランドが等しいかどうかは eflags レジスタの 2 ビットに格納されます。

これが私のコードです:

/* s1,s2 are source operands of sort bit-vector
 *       of 32 bits (defined somewhere else)
 * ctx is the context (defined somewhere else)
 * eflags is of sort bit-vector of 32 bits (initialized somewhere else)
 */

#define ZF_INDEX 6

Z3_ast ZF,OF,CF;              /* eflags bits */
ZF = Z3_mk_eq(ctx,s1,s2);
Z3_ast zf_mask = Z3_mk_rotate_left(ctx, ZF_INDEX ,Z3_mk_zero_ext(ctx,31,ZF));
eflags = Z3_mk_bvand(ctx,eflags, zf_mask);

問題は、z3 API に (想定される) ブール型の並べ替え (私の例では ZF) を (任意の長さの) ビットベクトルに変換する関数が見つからないことです。

ビットベクトルを返すZFのiteステートメントを使用して関数を作成することを考えましたが、これを行う従来の方法を知りたいです。

ありがとう、

ヘイジ。

4

1 に答える 1

2

あなたが説明したiteアプローチは伝統的な方法です。

于 2012-02-17T14:47:45.727 に答える