YASM:指令movsx拒绝双字作为操作数大小吗?

时间:2019-01-05 15:15:52

标签: assembly nasm x86-64 mov yasm

我正在编写的汇编程序将不会使用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

1 个答案:

答案 0 :(得分:3)

出于某种原因,汇编器调用所需的指令movsxd

movsxd rbx, dword [rsi+4*rcx]

这应该有效。

相关问题