Загрузочный сектор на MASM
ORIGIN EQU 7C00H ; Origin of bootstrap LOADER
SECTOR_SIZE EQU 512 ; Sector size in bytes
CODE SEGMENT
ASSUME CS:CODE,DS:NOTHING,ES:NOTHING,SS:NOTHING
ORG ORIGIN
jmp MAIN
MAIN:
cli ;Stop interrupts till stack ok
xor AX,AX
mov SS,AX ;Work in stack just below this routine
ASSUME SS:CODE
mov SP,ORIGIN
push SS
pop ES
ASSUME ES:CODE
mov si, offset msg
call print_string
jmp $
; =========================================================================
; DATA SECTION
msg db "Hello, world! I can boot!", 13, 10, 0
; =========================================================================
; SUBROUTINES SECTION
print_string: ; Output string in SI to screen
;pusha
mov ah, 0Eh ; int 10h teletype function
label1:
lodsb ; Get char from string
cmp al, 0
je done ; If char is zero, end of string
int 10h ; Otherwise, print it
jmp short label1
done:
;popa
ret
; =========================================================================
Free EQU (SECTOR_SIZE - 4) - ($-MAIN)
if Free LT 0
%out FATAL PROBLEM:boot sector is too large
;.ERR
endif
org origin + (SECTOR_SIZE - 2)
db 55h,0aah ; Boot sector signature
; =========================================================================
CODE ENDS
END MAIN
Для тестирования написал небольшой загрузочный сектор на masm, просто выводит строку на экран.
Компилируется без проблем такими командами MASM 6.11 с командной строки:
ml.exe msboot.asm /Fl /link
exe2bin.exe msboot.exe
В результате получаю exe файл заполненный нулями после компиляции и линковки. В чем может быть дело? Пробовал компилировать под DosBox та же проблема.
Источник: Stack Overflow на русском