Autor Thema: tutorial 1  (Gelesen 4628 mal)

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« 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


bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #1 am: 04. June 2006, 16:08 »
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
In the Future everyone will need OS-64!!!

nameac

  • Beiträge: 71
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 04. June 2006, 17:23 »
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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 04. June 2006, 17:26 »
Zitat von: nameac
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.

Zitat von: nameac
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ß.
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen