ASSUME数据寄存器有哪些示例:qualifiedtype [,数据寄存器:qualifiedtype]?

时间:2018-07-22 07:22:23

标签: assembly x86 masm

MASM描述了ASSUME指令的几种形式,仅显示了几个示例。我找不到任何一个例子是这个:

ASSUME dataregister : qualifiedtype [, dataregister : qualifiedtype]

我没有找到有关dataregister的信息。有人有这种格式的ASSUME指令的示例吗?什么是dataregister

1 个答案:

答案 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顺序。