Программа сборки, которую я пишу, не будет компилироваться с ассемблером y, цитируя:
error: invalid size for operand 2
В следующей строке:
movsx rbx, dword [rsi+4*rcx] ; Copy double-word and sign extend.
Однако я не могу найти причину, по которой dword
не должен работать. Я хочу переместить двойное слово (4 байта) по адресу rsi+4*rcx
в 8-байтовый регистр rbx
. Таким образом, остается 32 бита, которые нужно «дополнить» после копирования в то, что фактически равно ebx
. Если я изменю размер на byte
, я не получу ошибки. Но это не то, чего я хочу.
Здесь есть вопрос с похожим названием . Однако плакат забыл включить какие-либо операнды размера, и ответ на вопрос не решил мою проблему.
Изменить: я добавил полную программу ниже на случай, если конкретный синтаксис, который я скопировал здесь, не является виновником.
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
и позволяете встроенному нулевому расширению делать свою работу. - person Raymond Chen   schedule 05.01.2019