我有一行汇编,内容如下:
mov target[sizeof source - ecx],byte ptr ebx
但是,我收到错误A2032: Invalid use of register
据我所知,我没有做错任何事,但显然,我是。
任何帮助都将不胜感激。
答案 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中的低字节。