我对 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
withb
时,我是只添加变量的值,还是添加内存中的值和地址,因为我知道要获得特定值,它必须包含在[]
.
在 MASM(和 MASM 兼容模式下的 TASM)中,当您键入:
a
和b
是分别代表分配给双字10000h
和的存储地址的标签40000h
。当标签用作操作数时,MASM 知道标签代表内存地址,并确定参数是内存引用。要强制将内存地址用作立即值,可以
OFFSET
在标记之前使用它。总结:相反,当你写:
foo
和bar
是表示 42 和 66 的符号常量,没有为 42 和 66 保留空间。当使用符号常量作为参数时,MASM 将参数视为立即值。语句的含义根据其参数是标签还是常量而有所不同,这一事实可能会令人困惑。其他汇编器,例如 NASM(也叫 Yasm,它使用 NASM 语法)、IDEAL 模式下的 TASM 或 fasm,要求使用括号将参数视为内存引用,如果没有括号,它们总是将参数视为立即值。
使用该指令
a dword 10000h
定义一个包含值 10000h 的 4 字节内存区域,在这种情况下a
,它指的是该内存区域的地址(这将是编译器决定的那个),并且使用mov eax,a
累加器加载地址内存,而不是内存的内容。从您的问题中不清楚您想要实现什么,但这可能是以下两件事之一:
将存储在由 定义的内存区域中的值加载到累加器
a
(即,让处理器从 中读取 4 个字节a
并将结果存储在 中eax
)。在这种情况下,您应该使用mov eax,[a]
.定义
a
为常量,编译时直接替换为对应的值。在这种情况下,您应该将常量定义为a equ 10000h
(不要使用dword
)。编译后的代码将等同于mov eax,10000h
.这同样适用于指令
add
。