Добавить две переменные в сборку

У меня очередная программа на ассемблере 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, я добавляю только значение переменной или добавляю значение и адрес в память, потому что я понимаю, что для получения конкретного значения должно быть заключено в [].


person Peter Jason    schedule 26.02.2016    source источник


Ответы (1)


потому что я понимаю, что для получения конкретного значения нужно заключить его в []

В синтаксисе NASM вам понадобятся скобки.
В синтаксисе MASM/TASM их нет, а add eax,b означает то же самое, что и add eax,[b] (при условии, что b является меткой, а не чем-то вроде b EQU 42).

Если вы хотите добавить адрес b к eax в синтаксисе MASM/TASM, вы должны написать:

add eax, offset b
person Michael    schedule 26.02.2016
comment
b equ 42 по-прежнему является символом с немедленным значением. Метка для dd имеет непосредственное значение, равное его адресу. В синтаксисе GNU asm вы можете изменить значение метки с помощью директивы ассемблера. Это то же самое, является ли значение адресом или нет. Итак, если вы думаете об этом таким образом, b equ 42 концептуально то же самое, как если бы b был символом, определенным меткой. Как вы сказали, MASM/TASM неявно разыменовывает символы, которые являются метками (адресами), что делает невозможным узнать, что делает инструкция, не глядя на другие строки. - person Peter Cordes; 26.02.2016
comment
Я думаю, моя точка зрения заключается в том, что вы всегда можете использовать скобки при использовании операнда памяти для ясности и согласованности с синтаксисом NASM. Нет никакого преимущества в том, чтобы оставлять их, не так ли? Я бы посоветовал всегда использовать их, чтобы было легче обнаруживать операнды памяти в коде. - person Peter Cordes; 26.02.2016
comment
Ну, это вопрос личных предпочтений. В моем беспокойном прошлом я написал довольно большое количество ассемблированных синтаксиса MASM (например, десятки тысяч LOC), и я часто использовал стиль без квадратных скобок и не могу припомнить, чтобы из-за этого возникали какие-либо ошибки. Я бы использовал ALL_UPPER_CASE для приравнивания, чтобы различать их. Моя точка зрения на приравнивание в моем ответе заключалась в том, что add eax, b и add eax, [b] больше не означают одно и то же, если b было приравниванием для некоторого целочисленного литерала, например 42. - person Michael; 26.02.2016
comment
Это честно. Если вы привыкли мыслить в стиле MASM, я уверен, что он отлично работает, и вы понимаете, что имеете в виду. В основном это просто отстой для Stackoverflow, где мы пытаемся говорить об ассемблере в как можно более общем контексте. Мне лично нравится дизайнерское решение NASM, заключающееся в том, что метки не подразумевают размер операнда, и всегда требуются скобки для ссылок на память, это хорошее решение. Думая таким образом, MASM кажется мне странным. - person Peter Cordes; 26.02.2016