【发布时间】:2019-01-05 15:15:52
【问题描述】:
我正在编写的汇编程序无法使用 y 汇编器编译,引用:
error: invalid size for operand 2
在下面一行:
movsx rbx, dword [rsi+4*rcx] ; Copy double-word and sign extend.
但是,我找不到 dword 不起作用的任何原因。我想将地址rsi+4*rcx 处的双字(4 字节)移动到8 字节寄存器rbx 中。因此,在将其复制到有效的ebx 之后,还有 32 位需要“填充”。如果我将大小更改为byte,则不会出错。但这不是我想要的。
有一个标题相似的问题here。但是,发布者忘记包含任何大小的操作数,并且问题的答案并没有解决我的问题。
编辑:我在下面添加了完整的程序,以防我在这里复制的特定语法不是罪魁祸首。
segment .data
a:
dd 1
dd 3
dd 0
dd 1
dd 7
dd 9
dd 5
dd 2
b:
dd 8
dd 3
dd 3
dd 9
dd 6
dd 4
dd 1
dd 1
p dq 0
segment .text
global main
main:
xor rax, rax ; Set sum to 0.
xor rcx, rcx ; Set counter to 0.
lea rsi, [a] ; Set source 1.
lea rdi, [b] ; Set source 2.
dot:
movsx rbx, dword [rsi+4*rcx] ; Copy in double-word.
movsx rdx, dword [rdi+4*rcx] ; Copy in other double-word.
imul rbx, rdx ; Multiply the two double-words.
add rax, rbx ; Sum product so far.
inc rcx
cmp rcx, 8
jz done
jmp dot
done:
mov [p], rax
xor rax, rax
ret
【问题讨论】:
-
您的程序使用
movzx,而不是movsx。错字?没有movzx r64, r/m32指令,因为您只需编写mov r32, r/m32并让内置的零扩展来完成工作。 -
@RaymondChen 是的,我更正了。当我复制它时我正在试验。错误仍然适用于标题中所述的条件。
-
@RaymondChen 他的建议产生了同样的错误。
-
我已将您的问题作为副本关闭,因为副本有更好的答案。
-
@fuz 您将其标记为重复的问题是我访问并在我的帖子中提到的问题。但是答案并没有解决我的问题。
标签: assembly nasm x86-64 mov yasm