A2032:无效使用寄存器

时间:2015-09-26 18:29:41

标签: assembly x86 cpu-registers mov

我有一行汇编,内容如下:

mov target[sizeof source - ecx],byte ptr ebx

但是,我收到错误A2032: Invalid use of register

据我所知,我没有做错任何事,但显然,我是。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

两个错误:

汇编程序不知道byte ptr ebx是什么,处理器无法减去ECX(它只能添加)。

我想,以下序列可以满足您的需求:

neg ecx                              ; Change sign
mov target[sizeof source + ecx], bl
neg ecx                              ; Restore ECX (if needed)

答案 1 :(得分:1)

如果您尝试存储单个字节(即操作数大小= 8位的mov),则byte ptr将在地址之前,而不是在寄存器之前。

mov byte ptr [base + constant + ecx], bl  ;  bl is the low byte of ebx

汇编程序负责在汇编时将target + sizeof source添加到单个位移中以编码到机器代码中。就指令编码而言,它只是寄存器的偏移量,无论常量或寄存器是否具有指针"或"数组索引"。

offset1[offset2 + reg]看起来很不寻常,可能并不适用于所有英特尔语法变体。 (它让我想起AT& T语法是offset(%ecx),其中offset可以是任何汇编时常数的总和。)

The diagram in the x86 wikipedia article,显示哪个字节寄存器是较大寄存器的子集。它有点凌乱;我想我在其他地方看过更好的图表。也许https://stackoverflow.com/tags/x86/info中的其他一些链接会有所帮助。

无论如何,如果你想将ebx的低字节存储在[target + source - ecx],你需要先取消ecx。 rkhb的答案看起来很不错。

你评论说

mov bl,cl

在某种程度上有所帮助。这看起来很奇怪。您现在正在存储地址偏移的低字节,而不是以前在ebx中的低字节。