【问题标题】:YASM: Instruction movsx refuses dword for operand size? [duplicate]YASM:指令 movsx 拒绝操作数大小的 dword? [复制]
【发布时间】: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


【解决方案1】:

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

movsxd rbx, dword [rsi+4*rcx]

这应该可行。

【讨论】:

  • 遗憾的是,我仍然收到:invalid size for operand 2 作为实施此建议时的反馈。
  • 这很奇怪。您是否也尝试过movsxd rbx, [dword rsi+4*rcx]
  • 第二个建议也不起作用。这是我编译时发生的事情的快速demonstration,因此很明显我没有在其他地方犯错误。
  • @Micrified 哦,dword 关键字放在括号之前,抱歉。你能试试movsxd rbx, dword [rsi+4*rcx]吗?我一直很欣赏 ACME 用户。
  • @Micrified:一旦您了解了 SIMD 的任何内容,您应该能够理解我在说什么。另见agner.org/optimize,他的优化指南有一章是关于 SIMD 的。希望编译器也可以按照我从 C 循环中建议的方式自动矢量化,这样您就可以得到一个这样的示例。
猜你喜欢
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
相关资源
最近更新 更多