Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: nameac am 04. June 2006, 14:47
-
moin, habe versucht euer tutorial in masm zuübersetzen leider wird der string im "kernel" nicht ausgegeben vieleicht seht ihr den fehler die strings im bootloader werden ausgegeben
bootloader:
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
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
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
GROESSE DB 385 DUP("B"),0
DW 0AA55H
CODE_SEG ENDS
END START
kernel:
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG, DS:CODE_SEG
MOV AX, 1000H
MOV ES, AX
MOV DS, AX
START:
JMP M0
LOADMSG DB 2 DUP("ProgScheisse.",13,10),0
M0: MOV SI,OFFSET LOADMSG
CALL STRD
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
-
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
-
wozu dient
xor ax,ax
mov ds,ax
mov es,ax
hier weiß ich zwar was gemeint ist aber warum addiert man da nur 510 byte
org 7c00h+510
-
wozu dient
xor ax,ax
mov ds,ax
mov es,ax
das setzt ds und es auf 0. der grund ist, dass durch das org 07c00h davon ausgegangen wird, dass ds = es = 0.
hier weiß ich zwar was gemeint ist aber warum addiert man da nur 510 byte
org 7c00h+510
die bootsignatur 0aa55h kommt an das offset 510 im bootsektor. die bootsignatur selbst ist 2 bytes groß. insgesamt, ist der bootsektor also 512 bytes groß.