mov ah, 0xe
mov al, 'E'
mov bl, 1
int 0x10
loop: jmp loop ; чтобы прога зациклилась и не выполнялся последующий мусор в памяти
boot файл написал, ЧТО ДАЛЬШЕ??
ассемблировал в БИН файл - а что делать дальше !!?? как его запихнуть в бут сектор образа???? кучу прог перепробовал - ничего не выходит!
напишите что и как делать чтобы получить загрузочный образ ISO в котором мой файл будет в бут секторе, желательно поподробнее
на всекий случай вот мой код(ФАСМ)
use16
org 7C00h
BEGIN:
mov ah, 09h
mov dx, msg
int 21h
xor ax, ax
jmp INPUT
INPUT:
INT 16h
sub al, 30h
mov ah, 0h
PUSH AX
cmp sp, 0FFFAh
jz FINISH
jnz BEGIN
FINISH:
pop ax
pop bx
mov ah, bl
add al, ah
add al, 30h
mov ah, 0Eh
int 10h
int 20h
msg db "Enter number:$"
times 459 nop ; это чтобы программа была ровно 512 байт
за ответы заранее спасибо
times 459 nop ;
на
times 457 nop ;
db 55h, 0aah
2) http://www.codenet.ru/progr/asm/boot-loader.php
3) Бут-сектор - это тупо первые 512 байт образа. Если больше на диск ничего записывать не надо, то твой bin файл - это и есть образ. Записать его на диск можно разными способами, но пожалуй удобнее всего вместо этого запустить в эмуляторе: VirtualBox, Qemu и т.д.
4) *.iso - это скорее не образ диска, а файл, в котором хранится файловая система в формате ISO, используемая для дисков. В твоем случае назвать получившийся образ iso-образом нельзя т.к там не будет этой файловой системы.
Цитата: P*t*
3) Бут-сектор - это тупо первые 512 байт образа. Если больше на диск ничего записывать не надо, то твой bin файл - это и есть образ. Записать его на диск можно разными способами, но пожалуй удобнее всего вместо этого запустить в эмуляторе: VirtualBox, Qemu и т.д.
4) *.iso - это скорее не образ диска, а файл, в котором хранится файловая система в формате ISO, используемая для дисков. В твоем случае назвать получившийся образ iso-образом нельзя т.к там не будет этой файловой системы.
последние 2байта исправил спасибо
а вот просто так дать на выполнение VirtualBox неполучается - выбрал файл оно его нпропускает ссылаясь на ошибку открытия а QEMU просто останавливается и ничего не делает
что первые 512 байт на диске - то понятно а вот как туда впихнуть мою программу......
Можешь попробовать запустить с дискеты.
В qemu это выглядит так: "qemu -fda boot.bin"
не идет все равно
Ты используешь прерывание 0х21 - это прерывание DOS и в загрузчике работать не будет.
http://www.codenet.ru/progr/dos/
На экран нужно выводить через 0x10 (http://www.codenet.ru/progr/dos/int_0009.php), либо через прямую запись в видеопамять (начинается с 0xb8000, если не ошибаюсь).
Помимо этого часто бывает, что неправильно настроен сегмент данных и указатель на строку ("Enter number:$") ссылается мимо.
Соответственно советую:
1) В начале программы использовать какой-нибудь вызов, не принимающий в параметры казателей, чтобы увидеть что программа запускается. Например очистку экрана.
2) Проинициализировать ds:
mov ax, 0
mov ds, ax
use16
org 7C00h
BEGIN:
mov ah, 0Eh
mov al, 'E'
int 10h
mov al, 'n'
int 10h
mov al, 't'
int 10h
mov al, 'e'
int 10h
mov al, 'r'
int 10h
mov al, ' '
int 10h
mov al, 'n'
int 10h
mov al, 'u'
int 10h
mov al, 'm'
int 10h
mov al, 'b'
int 10h
mov al, 'e'
int 10h
mov al, 'r'
int 10h
mov al, ':'
int 10h
xor ax, ax
jmp INPUT
INPUT:
INT 16h
sub al, 30h
mov ah, 0h
PUSH AX
cmp sp, 0FFFAh
jz FINISH
jnz BEGIN
FINISH:
pop ax
pop bx
mov ah, bl
add al, ah
add al, 30h
mov ah, 0Eh
int 10h
int 20h
times 424 nop
db 55h, 0AAh
в QEMU не идет все равно.........
Во всяком случае у меня вот такой код на nasm работает:
Код:
Выводит букву E.
1) При компиляции нужно указывать бинарный формат
2) Qemu считывает файлы по 512 байт, так что если размер файла меньше 512, работать ничего не будет.
Похоже у тебя здесь неправильный размер: "times 424 nop". Проверь, что файл ровно 512 байт занимает.
В приведенном выше примере я просто к получившемуся файлу (11 байт) добавлял еще 501 произвольный байт.
0x55, 0xaa у меня нет, поэтому для qemu нужно указывать параметр -no-fd-bootchk:
qemu -no-fd-bootchk -fda prog
при компиляции написало что 512 байт
Программа вообще ничего не выводит?
Не знаю, что еще можно посоветовать.
Разве что убрать int 20h в конце - это тоже прерывание DOS. Вместо него лучше просто зациклить программу (loop: jmp loop).
org 7C00h
BEGIN:
mov ah, 0Eh
mov al, 'E'
int 10h
mov al, 'n'
int 10h
mov al, 't'
int 10h
mov al, 'e'
int 10h
mov al, 'r'
int 10h
mov al, ' '
int 10h
mov al, 'n'
int 10h
mov al, 'u'
int 10h
mov al, 'm'
int 10h
mov al, 'b'
int 10h
mov al, 'e'
int 10h
mov al, 'r'
int 10h
mov al, ':'
int 10h
xor ax, ax
jmp INPUT
INPUT:
INT 16h
sub al, 30h
mov ah, 0h
PUSH AX
cmp sp, 0FFFAh
jz FINISH
jnz BEGIN
FINISH:
pop ax
pop bx
mov ah, bl
add al, ah
add al, 30h
mov ah, 0Eh
int 10h
OLOLOOP:
jmp OLOLOOP
times 424 nop
db 55h, 0AAh
всеравно не пашет ((
походу без образа тут ничего не сделать((
Покажи команду компиляции и команду запуска. И напиши наконец, как выражается то, что оно не работает.
выражается в том что оно ничего вообще не делает, только когда что-то нажмешь обновляет последние 3 строчки
Но у тебя подключен еще и образ CD (там все еще записана неправильная программа?) и по умолчанию загрузка происходит с него.
Либо отключи образ CD, либо добавить опцию "-boot a" для изменения стандартного порядка загрузки.
СПС большое!