使用绝对地址组装和链接模块

时间:2016-07-28 21:58:17

标签: assembly masm x86-16

我正在尝试制作一个位于绝对地址的模块。任何提及OFFSET或尝试调用子程序都会导致链接失败。

示例:

.8086

_TEXT   SEGMENT BYTE AT 440H
    ORG 4400H
    ASSUME  CS:_TEXT

START:
START_O EQU THIS WORD
;   MOV DI, OFFSET START
;   MOV DI,START_O
;   CALL SUBR
;   CALL SUBR_O


SUBR:
SUBR_O EQU $-7C00h
    RET


_TEXT   ENDS
    END

我正在使用Microsoft MASM 5.0汇编程序和关联的链接器。命令:

masm bull,bull,bull;
link bull;

如果任何一个评论行被取消注释,masm将会成功,但该链接将报告:

BULL.OBJ(bull.ASM) : error L2001: fixup(s) without data
 pos: 41 Record type: 9C

1 个答案:

答案 0 :(得分:2)

我假设您有一个加载程序,它将在00000:04400h加载此代码,目标是生成.com文件。在这种情况下,您不需要指定细分地址。

_TEXT   SEGMENT    ;assume loaded at 00000h:04400h
        ASSUME  CS:_TEXT
        ORG     00000H
START:  MOV     DI,OFFSET CS:START
        CALL    SUBR
        RET
        ORG     07C00H-04400H
SUBR:   RET
_TEXT   ENDS
        END     START

注意 - 这将创建一个大的.com文件(长14337个字节)。如果SUBR是外部代码,您可能希望使用类似的东西来创建一个小的.com文件:

_TEXT   SEGMENT    ;assume loaded at 00000h:04400h
        ASSUME  CS:_TEXT
        ORG     00000H
START:  MOV     DI,OFFSET CS:START
        CALL    START+07C00H-04400H
        RET
_TEXT   ENDS
        END     START