madanra wrote:Could you post your code?
Here is my code, i wrote assembly x86 only from 1 month, so i'am sorry if the code is not perfect or if i do some stupid operation
Code: Select all
[BITS 16]
[ORG 0x600]
;XOR AX,AX
;MOV DS,AX
; ----- copy mbr -----
XOR AX,AX
MOV DS,AX
MOV SS,AX
MOV ES,AX
MOV SP,0x7C00 ;indirizzo sorgente copia
MOV SI,SP
MOV DI,0x600 ;indirizzo destinazione copia
MOV CX,0x100 ;numero di volte da ripetere movsw
CLD
REP ;ripete l'istruzione successiva
MOVSW ;sposta 2 byte alla volta da 0x7C00 a 0x600
PUSH AX
PUSH 0x61B ;mette nello stack l'indirizzo della prossima
RETF ;istruzione nella nuova area di memoria
; ----- copy mbr end -----
; --- main ---
MOV SI, WelcomeS ;titolo mbr
CALL PrintS
Control: ;ciclo di controllo
MOV SI, [Padd]
CMP BYTE [SI],0x80 ;controlla se il primo byte della tabella delle part e' 0x80
JE ShowBP ;se vero salta a ShowBP
Control2:
CMP BYTE [Pnum],0x4 ;controlla se Pnum e' 0x4
JE Control3 ;se vero salta a ContS2
INC BYTE [Pnum] ;incrementa Pnum
ADD WORD [Padd], 0x10 ;aggiunge 16 a Padd
ADD WORD [VBRadd], 0x200
JMP Control ;riavvia il ciclo di controllo
Control3:
CMP BYTE [CountP],0x00
JNE SelectP
INT 0x18
ShowBP: ;stampa il numero corrispondente alla partizione avviabile
INC BYTE [CountP]
MOV AL,[Pnum] ;mette il contenuto di Pnum in AL
ADD BYTE AL,0x30
CALL PrintCh ;stampa il carattere a video
MOV AL,0x20 ;stampa spazio
CALL PrintCh
;----
MOV BP,[Padd]
PUSH 0x00000000
PUSH DWORD [BP+0x08]
PUSH 0x0000
PUSH WORD [VBRadd]
PUSH 0x0001
PUSH 0x0010
MOV AH,0x42
MOV DL,[BP+0x00]
MOV SI,SP
INT 0x13
;----
;****
XOR DL,DL
MOV BP,[VBRadd]
ADD BP,0x3
ShowBP2:
MOV AL,[BP]
CALL PrintCh
INC BP
INC DL
CMP DL,0x08
JNE ShowBP2
MOV AL,0xD
CALL PrintCh
MOV AL,0xA
CALL PrintCh
;****
JMP Control2 ;prosegue la funzione principale di controllo
SelectP: ;input partizione da avviare
MOV SI, InstrS ;stampa Select volume
CALL PrintS
SelectP2: ;controlla il tasto premuto
XOR AH,AH ;azzera AH (per int 16h)
INT 0x16 ;attende input da tastiera
MOV AH,AL ;copia l'ascii in AH
SUB AH,0x30 ;sottrae dall'ascii 0x30 per trasformarlo in numero
CMP AH, 0x4 ;controlla se e' maggiore di 4
JG SelectP2
CMP AH, 0x1 ;controlla se e' minore di 1
JL SelectP2
MOV WORD SI,0x7BE
;****
DEC AH
;MOV [Pnum],AH
MOV DL, AH
IMUL CX, DX, 0x10
ADD SI,CX
;****
CMP BYTE [SI],0x80 ;controlla che sia avviabile
JNE SelectP2 ;se no torna all'input
MOV WORD [Padd],SI ;---- win?----
CALL PrintCh ;se si stampa il numero premuto
JMP LoadVBS ;e passa al bootstrap
LoadVBS: ;load volume boot sector selected
MOV SI, LoadS
CALL PrintS
IMUL CX, DX, 0x200
MOV SP,0x800
ADD SP,CX ;indirizzo sorgente copia
MOV SI,SP
MOV DI,0x7C00 ;indirizzo destinazione copia
MOV CX,0x100 ;numero di volte da ripetere movsw
CLD
REP ;ripete l'istruzione successiva
MOVSW ;sposta 2 byte alla volta da 0x7C00 a 0x600
XOR AX,AX
MOV CX,AX
MOV DX,AX
MOV DL,0x80
PUSH AX
PUSH 0x7C00 ;mette nello stack l'indirizzo della prossima
RETF ;istruzione nella nuova area di memoria
; --- main --- end
;--- stampa una stringa a video
PrintS:
nxtCh: ;ciclo caratteri
MOV AL, [SI] ;sposta il contenuto dell'indirizzo di si in al
OR AL, AL ;conrolla se al e' azzerato
JZ exitF ;se vero (zero) esce
CALL PrintCh ;altrimenti richiama la stampa a video del carattere
INC SI ;incrementa il puntatore ai caratteri della stringa
JMP nxtCh ;riavvia il ciclo di stampa
exitF:
RET
;--- stampa un carattere a video ---
PrintCh:
MOV AH, 0x0E ;imposta i parametri per la stampa a video
XOR BH, BH
MOV BL, 0x07
INT 0x10 ;stampa a video il contenuto di al
RET
CountP DB 0x00
Pnum DB 0x1
Padd DW 0x7BE ;org 600 --> 7BE, org 7C00 --> 7DBE
VBRadd DW 0x800
WelcomeS DB 'OrangeSec MBR',13,10,0
InstrS DB 13,10,'Select volume: ',0
LoadS DB 13,10,'Loading...',0
Combuster wrote:Did you include the corresponding segment register?
Do you mean the start of the partition table it is booting?
Just tried with windows xp and it boots correctly, I think there are problem only with windows vista and 7