2016-07-28 19 views
0

Ich versuche ein Modul zu machen, das sich an einer absoluten Adresse befindet. Jede Erwähnung von OFFSET oder der Versuch, eine Subroutine aufzurufen, führt dazu, dass die Verbindung fehlschlägt.Zusammenbau und Verbindung des Moduls mit absoluten Adressen

Beispiel:

.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 

Ich bin mit dem Microsoft MASM 5.0 Assembler und zugehörige Linker. Befehle:

masm bull,bull,bull; 
link bull; 

Wenn einer der kommentierten Zeilen ist uncommented masm erfolgreich sein wird, aber der Link berichten:

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

Antwort

2

Ich nehme an, Sie einen Lader, die diesen Code bei 00000 geladen werden kann: 04400h Ziel ist es, eine .com-Datei zu erstellen. In diesem Fall müssen Sie die Segmentadresse nicht angeben.

_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 

Hinweis - dies wird eine große .com-Datei (14337 Bytes lang) erstellen. Wenn SUBR ein externes Stück Code ist, möchten Sie vielleicht so etwas verwenden, um eine kleine .com-Datei zu erstellen:

_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