Складывать две переменные в Сборщике MASM

У меня есть сомнение относительно суммы в реестрах для Сборщика MASM

 TITLE Suma variables
 INCLUDE Irvine32.inc
 .data
 a dword 10000h
 b dword 40000h
 valorFinal dword ?
.code
 main PROC
       mov eax,a ; empieza con 10000h
       add eax,b ; suma 40000h
       mov valorFinal,eax ; 
      call DumpRegs
      exit
 main ENDP
 END main

Мое сомнение, - когда я использую add с b, я добавляю только стоимость переменной, или добавляю стоимость и адрес к памяти, потому что я понимаю, что, чтобы получать стоимость в частности, нужно заключать между [].

8
задан 24.03.2017, 15:41
2 ответа

В MASM (и TASM в совместимом способе с MASM), когда ты пишешь:

a dword 10000h
b dword 40000h

a и b это этикетки, которые представляют адрес хранения, распределенного двойным словам 10000h и 40000h соответственно.

Когда используется этикетка, как действуя, MASM знает, что эта этикетка представляет адрес памяти, и решает, что параметр - ссылка на память. Чтобы вынуждать, в который был использован адрес памяти как немедленная стоимость, возможно использовать OFFSET предшествуя в этикетку. Обобщая:

mov eax, a          ; mueve 10000h a eax
mov eax, OFFSET a   ; mueve la dirección donde está 10000h a eax
mov eax, [a]        ; en MASM equivale a MOV eax, a

Взамен, когда он пишет себе:

foo EQU 42
bar EQU 66

foo и bar это символические постоянные величины, которые представляют 42 и 66, и не размещается место для 42 и 66. Использовав символическую постоянную величину как параметр, MASM относится к параметру как к немедленной стоимости.

mov eax, foo        ; mueve 42 a eax

Тот факт, что значение инструкции отличалось, если Ваши параметры - этикетки или постоянные величины, смоги оказываться смущенным. Другие сборщики, как NASM (также Yasm, который использует синтаксис NASM), TASM в ИДЕАЛЬНОМ способе, или fasm, они требуют, чтобы были использованы квадратные скобки, чтобы относиться к параметру как к ссылке на память, и если нет квадратных скобок, они всегда относятся к параметру как к немедленной стоимости.

9
ответ дан 24.11.2019, 14:52
  • 1
    твой ответ и ответ @Konamiman противоречивые. и #191; qui и # 233; n у него есть raz и # 243; n? – angus 18.02.2016, 18:25

С инструкцией a dword 10000h ты определяешь зону 4-байтовой памяти, которая содержит стоимость 10000h, в этом случае a он относится к адресу этой зоны памяти (которая будет той, что составитель решит) и с mov eax,a загрузь в аккумуляторе адрес памяти, не контент памяти.

Из-за твоего вопроса не остается ясным, что является тем, чего ты хочешь достичь, но вероятно это будет одна из этих двух вещей:

  1. Загружать аккумулятор стоимостью, хранившейся в зоне памяти, определенной из-за a (а именно, способствовать тому, чтобы процессор прочитал 4 байт начиная с a и храните результат в eax). В этом случае ты должен использовать mov eax,[a].

  2. Определять a как постоянная величина, которая будет заменена прямо на соответствующую стоимость во времени компиляции. В этом случае ты должен определять постоянную величину как a equ 10000h (не используй dword). Объектный код будет тогда эквивалентом в mov eax,10000h.

И то же самое применяется к инструкции add.

7
ответ дан 24.11.2019, 14:52

Теги

Похожие вопросы