gpt4 book ai didi

assembly - 使用 masm 的 ASSUME 指令

转载 作者:行者123 更新时间:2023-12-02 00:18:22 25 4
gpt4 key购买 nike

我一直在尝试使用 ASSUME 编写汇编代码,但不断出现我无法找出原因的错误。这里有几个例子:示例 1

.286
.model medium, c
pproc typedef ptr proc
.data
dummy db ?
.code
assume bx:ptr pproc
call [bx]
end

组装时没有出错。

如果我将 .286 更改为 .386,则会出现以下错误:
错误 A2158:类型是错误的寄存器大小
该行发生此错误:假设 bx:ptr proc

为什么会发生? ASSUME 中需要更改哪些内容才能更正错误?

注意:我注意到 pproc 被汇编程序定义为 FAR 指针。为什么?


示例 2:

.286
.model medium
.data
dummy db ?
.code
assume bx:near ptr
call [bx]
call near ptr [bx[
end

现在,如果我只是将 .286 更改为 .386,则会出现以下汇编错误:
假设 bx:near ptr
A2158:寄存器的类型大小错误

为什么会出现此错误?这是近段。请注意,执行相同操作的指令没有假设。


示例 3

.286
.model medium, c
.data
dummy db ?
.code
assume bx:ptr byte
mov [bx],12h
mov byte ptr [bx],12h
end

现在,如果我只是将 .286 更改为 .386,当尝试组装它

for line: assume bx:ptr byte 我得到错误
A2158:寄存器的类型大小错误
为什么会发生? ASSUME 中需要更改哪些内容才能更正错误?

对于行:mov [bx],12h
发生以下错误:error 2070 :invalid instruction operands.

为什么会出现此错误?这是一个错误吗?这应该有效,我正在尝试将 12h 存储到 [bx] 中。请注意,执行相同操作的指令没有假设。

最佳答案

MASM 6.1 documentation是编写实模式分段代码(非 FLAT 模型)的好资源。第 43-47 页有关于 ASSUME 和段字大小的很好信息。您遇到的是一种相当微妙的方式的副作用,在这种方式中,ASSUME 将根据您将 .386 指令相对于 .MODEL<放置的位置进行操作 指令。 设置段字大小(仅限 80386/486) 部分记录了这种微妙的行为:

Setting Segment Word Sizes (80386/486 Only)

The use type in the SEGMENT directive specifies the segment word size on the 80386/486 processors. Segment word size determines the default operand and address size of all items in a segment. The size attribute can be USE16, USE32, or FLAT. If you specify the .386 or .486 directive before the .MODEL directive, USE32 is the default. This attribute specifies that items in the segment are addressed with a 32-bit offset rather than a 16-bit offset. If .MODEL precedes the .386 or .486 directive, USE16 is the default. To make USE32 the default, put .386 or .486 before .MODEL. You can override the USE32 default with the USE16 attribute, or vice versa.

您需要注意的是放置.386 的位置。您已将它放在 .model 之前,因此汇编器默认所有部分都是 USE32。您似乎正在编写将在 16 位实模式下运行的代码(可能使用 386 条指令和寄存器),因此我相信您会希望确保 USE16 是使用 时的默认值。 code.data 指令。为了获得您想要的行为,我认为您可能希望考虑更改:

.386
.model medium, c

收件人:

.model medium, c
.386

观察会发生什么。


这是我相信您遇到的第二个问题。 MASM 5.1 有这个 supplemental information添加到它可能会阐明您与 FAR PTRNEAR PTR 的问题。内容如下:

The PTR Operator

The PTR operator can be used to specify the size of a register indirect operand for a CALL or JMP instruction. However, the size cannot be specified with NEAR or FAR Use WORD or DWORD instead. (In 80386 32-bit segments, use DWORD or FWORD.) Examples are shown below:

      ; 8086, 80826, or 80386 16-bit mode

jmp WORD PTR [bx] ; Legal near jump
call NEAR PTR [bx] ; Illegal near call
call DWORD PTR [bx] ; Legal far call
jmp FAR PTR [bx] ; Illegal far jump

; 80386 32-bit mode only

jmp DWORD PTR [bx] ; Legal near jump
call NEAR PTR [bx] ; Illegal near call
call FWORD PTR [bx] ; Legal far call
jmp FAR PTR [bx] ; Illegal far jump

This limitation only applies to register indirect operands. NEAR or FAR can be applied to operands associated with labels. Examples are shown below:

      jmp  NEAR PTR pointer[bx] ; Legal
call FAR PTR location ; Legal

USE32 部分,如果你想做一个间接的 FAR JMP/CALL 使用:

pproc typedef ptr fword

如果你想在 USE32 部分进行近乎间接的调用,请执行以下操作:

pproc typedef ptr dword

USE16 部分,如果你想做一个间接的 FAR JMP/CALL 使用:

pproc typedef ptr dword

如果你想在 USE16 部分进行近乎间接的调用,请执行以下操作:

pproc typedef ptr word

关于assembly - 使用 masm 的 ASSUME 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com