2016-11-13 5 views
1

en premier, désolé pour mon mauvais anglais, je suis français. En ce moment, j'apprends asm avec fasm pour tester la programmation du secteur d'amorçage.FASM - secteur de démarrage sur USB ne fonctionne pas

J'ai fait un programme de démarrage simple, je l'ai compilé et j'écris boot.bin dans le premier secteur de mon usb.

Mais quand je boot sur mon PC ou VirtualBox, le lecteur ne se trouve pas ....

Code du secteur d'amorçage:

;======================================================================= 
; a simpliest 1.44 bootable image by shoorick ;) 
;======================================================================= 
_bs equ 512 
_st equ 18 
_hd equ 2 
_tr equ 80 
;======================================================================= 
    org 7C00h 
    jmp start 
    nop 
;===================================================== 
    db "HE-HE OS";  ; 8 
    dw _bs    ; b/s 
    db 1    ; s/c 
    dw 1    ; rs 
    db 2    ; fats 
    dw 224    ; rde 
    dw 2880   ; as 
    db 0F0h   ; media 
    dw 9    ; s/fat 
    dw _st    ; s/t 
    dw _hd    ; h 
    dd 0    ; hs 
    dd 0    ; -- 
    db 0    ; drv 
    db 0    ; -- 
    db 29h    ; ebr 
    dd 0    ; sn 
    db "NO NAME "; ; 11 
    db "FAT12 ";  ; 8 
;===================================================== 
start: 
    mov ax,cs 
    mov ds,ax 
    mov cx,count 
    mov si,hello 
    mov bx,7 
    mov ah,0Eh 
@@: 
    lodsb 
    int 10h 
    loop @B 
    xor ah,ah 
    int 16h 
    int 19h 

hello db "Hi! This is disk-invalid!" 
count = $ - hello 

;======================================================================= 
    rb 7E00h-2-$ 
    db 055h,0AAh 
;======================================================================= 

Ce code est de fournir des exemples du site de fasm .

+1

Avez-vous mis la Order_ de _boot correct dans votre BIOS? Si possible, déplacez le périphérique USB vers le haut. – Fifoernik

Répondre

0

il y a deux raisons pour lesquelles un travail wont bootloader:

  1. le bootloader est pas dans le premier secteur de l'USB/disquette/etc.
  2. le bootloader n'est pas EXACTEMENT 512 octets
  3. vous manque la signature 0xAA55 au 2 derniers octets du bootloader

dans votre exemple, je suppose que vous avez la mauvaise taille de bootloader (il est pas 512 octets)

essayez de remplacer

rb 7E00h-2-$ 
db 055h,0AAh 

avec

TIMES 510-($-$$) DB 0 
DW 0xAA55  

Cela garantit que votre fichier est exactement 512 octets et est a la signature Bootloader nécessaire

+0

Son fichier assembleur est correct. La DB et le DW que vous utilisez sont la même chose exprimée différemment. 'rb 7E00h-2- $' est en fait valide et génèrera les octets nécessaires pour compléter le pad 510 où la signature de démarrage est placée. Le rendre 512. 'rb' est une directive _FASM_ pour réserver un nombre spécifié d'octets. –

+0

@Michael Petch hm étrange si j'essaie d'utiliser sa méthode pour remplir les 510 octets puis j'obtiens un fichier binaire de 32256 octets de long. Im utilisant l'assembleur plat 1.71.51 – SeeSoftware

+0

Je m'attendrais à ce que vous obteniez 32256 si vous n'utilisiez pas 'org 07c00h' –