Z3Py:我应该如何表示一些32位;16位和8位寄存器?

Z3Py:我应该如何表示一些32位;16位和8位寄存器?,z3,z3py,Z3,Z3py,我是Z3的新手。对不起,如果这是一个愚蠢的问题 我基本上是在x86-32位汇编指令上实现一个简单的符号执行引擎。我现在面临的问题是: 假设在执行之前,我使用BitVec初始化了一些寄存器 self.eq['%eax'] = BitVec('reg%d' % 1, 32) self.eq['%ebx'] = BitVec('reg%d' % 2, 32) self.eq['%ecx'] = BitVec('reg%d' % 3, 32) self.eq['%edx'] = BitVec('

我是
Z3
的新手。对不起,如果这是一个愚蠢的问题

我基本上是在
x86-32位
汇编指令上实现一个简单的符号执行引擎。我现在面临的问题是:

假设在执行之前,我使用
BitVec
初始化了一些寄存器

self.eq['%eax']  = BitVec('reg%d' % 1, 32)
self.eq['%ebx']  = BitVec('reg%d' % 2, 32)
self.eq['%ecx']  = BitVec('reg%d' % 3, 32)
self.eq['%edx']  = BitVec('reg%d' % 4, 32)
所以我的问题是,如何处理一些
16位
甚至
8位
寄存器

我是否可以从32位的
BitVec
中提取一个
8位的
部分,给它赋值,然后放回去?我可以在
z3
中这样做吗?还是有更好的办法


我明白了吗?多谢各位

您可以提取位向量的部分,从而产生一个新的、更小的位向量值,您可以使用任何方式(例如add)

通过首先提取所有部分,然后将较小的位向量连接成一个较大的位向量,可以替换位向量的部分

例如,增加eax的上半部分如下:

eaxNew = concat(add(extract(eaxOld, upperHalf), 1), extract(eaxOld, lowerHalf))
(伪代码)