Hi,
ich würde nicht empfehlen in tasm/masm ein OS zu schreiben. Besonders wenn du im 32 Bit PM willst, ist das mit masm/tasm nicht so gut. Aber ich habe dir das mal für tasm/masm (mit tasm getestet) angepasst:
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG, DS:CODE_SEG
ORG 07C00H
START:
JMP M0
BOOTDRV DB 0
LOADMSG DB 2 DUP("BootScheisse.",13,10),0
M0:
CLI
XOR AX, AX
MOV DS, AX
MOV ES, AX
MOV AX, 9000H
mov SS, AX
mov SP, 0
STI
MOV [BOOTDRV], DL
CALL LOAD
CALL LOAD1
MOV SI,OFFSET LOADMSG
CALL STRD
MOV AX, 1000H
MOV ES, AX
MOV DS, AX
PUSH AX
MOV AX, 0
PUSH AX
RETF
LOAD PROC NEAR
PUSH DS
M1: MOV AX, 0
MOV DL, [BOOTDRV]
INT 13H
JC M1
POP DS
RET
LOAD ENDP
LOAD1 PROC NEAR
M2: MOV AX,1000H
MOV ES,AX
MOV BX, 0
MOV AH, 2
MOV AL, 5
MOV CX, 2
MOV DX, 0
INT 13H
JC M2
RET
LOAD1 ENDP
STRD PROC NEAR
M4: LODSB
OR AL,AL
JZ M3
MOV AH,0EH
MOV BX,0007H
INT 10H
JMP M4
M3: RET
STRD ENDP
ORG 7C00h+510
DW 0AA55H
CODE_SEG ENDS
END START
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG, DS:CODE_SEG
START:
MOV AX, 1000H
MOV ES, AX
MOV DS, AX
JMP M0
LOADMSG DB 2 DUP("ProgScheisse.",13,10),0
M0: MOV SI,OFFSET LOADMSG
CALL STRD
JMP $ ;Endloßschleife
STRD PROC NEAR
M4: LODSB
OR AL,AL
JZ M3
MOV AH,0EH
MOV BX,0007H
INT 10H
JMP M4
M3: RET
STRD ENDP
CODE_SEG ENDS
END START
Dem Assembler musst du dann eine *.com Datei vorgaukelt, damit er keine EXE Header reinmacht. TASM macht das nichts wenn dort kein org 100h steht. Wie das bei masm ist weiß ich nicht. So assemblierst du mit tasm:
tasm boot.asm
tlink /t boot , boot.bin
tasm kernel.asm
tlink /t kernel , kernel.bin
Und dann zusammenkopieren:
copy /b boot.bin + kernel.bin = OS.img
Habe ich mit VMware getestet. Dürfte also funktionieren.
bitmaster