MASM描述了ASSUME指令的几种形式,仅显示了几个示例。我找不到任何一个例子是这个:
ASSUME dataregister : qualifiedtype [, dataregister : qualifiedtype]
我没有找到有关dataregister
的信息。有人有这种格式的ASSUME
指令的示例吗?什么是dataregister
?
答案 0 :(得分:4)
在未明确指定通用寄存器(qualifiedtype
的情况下,用于为存储操作数提供类型(dataregister
)。
MASM通常可以根据另一个操作数的大小来推断内存操作数的大小。在下面的示例中,MASM知道目标内存操作数必须为DWORD大小,因为源操作数为DWORD大小:
mov [edx], eax
但是有时由于没有其他操作数或者因为另一个操作数的大小未知,MASM无法做到这一点:
inc [ebx] ; error A2023:instruction operand must have size
mov [edx], 0 ; error A2070:invalid instruction operands
通常的解决方案是使内存操作数的大小明确:
inc BYTE PTR [ebx]
mov DWORD PTR [edx], 0
但是,您可以告诉MASM,当在内存操作数中使用给定寄存器时,应假定该内存操作数为给定类型:
ASSUME ebx:PTR BYTE
ASSUME edx:PTR DWORD
inc [ebx]
mov [edx], 0
当您需要显式指定很多内存操作数的大小时,这可能很方便,但是从风格上讲,我不建议这样做,因为这会使您的代码不太清楚。可能值得使用的一种情况是结构,因为将其与内存操作数一起使用的语法可能有点混乱:
mov (linked_list_node PTR [ecx]).prev, esi
mov (linked_list_node PTR [ecx]).next, 0
mov (linked_list_node PTR [ecx]).data, al
ASSUME ecx:PTR linked_list_node
mov [ecx].prev, esi
mov [ecx].next, 0
mov [ecx].data, al
我不知道为什么内存操作数使用type PTR
顺序,而ASSUME使用PTR type
顺序。