В чем ошибка в простой программе MASM
У меня есть код на ассемблере masm:
include console.inc
.data
var1 dq 179
var2 dq 100
var3 dq 0
.code
Start:
mov var3, var2
add var3, var1
outint var3
exit
end Start
Как надеюсь я, он должен вывести 279, но оно выдает ошибку при сборке:
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: hello.asm
hello.asm(9) : error A2070: invalid instruction operands
hello.asm(10) : error A2070: invalid instruction operands
Я не понимаю в чем проблема и не могу найти решения в интернете. Я изучаю пока по вот этому сайту: warmland.ru/cs/masm/
Подскажите пожалуйста, я новичок в assemblere
Ответы (1 шт):
Отвечаю.
mov var3, var2
add var3, var1
Одним из базовых правил, которые излагаются на первых страницах любого толкового учебника по ассемблеру для x86/amd64, является следующее: в инструкциях с двумя операндами оба операнда не могут быть ячейками памяти! Возможны комбинации: память-регистр, память-число, регистр-память, регистр-регистр. Комбинация память-память запрещена! Об этом вам транслятор и сообщил.
По-этому, для вычисления выражения var3 = var2 + var1, вам надо использовать буферный(ные) регистр(ы).
Для x86 (32-битный ассемблер):
;записываем var2 в пару EDX:EAX (у нас же 64-битные вычисления)
mov eax, dword ptr var2
mov edx, dword ptr var2[4]
;складываем с var1
add eax, dword ptr var1
adc edx, dword ptr var1[4]
;записываем результат в var3
mov dword ptr var3, eax
mov dword ptr var3[4], edx
Для amd64 (хотя вряд ли это ваш случай):
mov rax, var2
add rax, var1
mov var3, rax
Ну и да, выводить в консоль надо также 64-битный результат.