; init seg ;настраиваем сегментные регистры:
cli ;запрещаем прерывания
[COLOR="Red"]mov ax,cx[/COLOR]
mov ds,ax ; data на сегмент кода
mov es,ax ; bss тоже
собственный загрузчик
загрузчика, решил попробовать в целях узнать чтото новое,
полазил по инету, почитал, в итоге родился такой код,
пытающийся вывести несколько символов
компилил так: nasm -f bin exboot.s -o exboot.bin
===============================================
jmp _start ;прыг на старт
;----------------------
; DATA
;----------------------
BOOTADR equ 0x7C00 ; куда BIOS педаст управление.
; выше BOOTADR есть свободное
; место(0x0600..0x7C00 ), помещаем
; туда стек:
STACKSTART equ 0x7B00 ; дно стека
STACKSIZE equ 0x0200 ; размер стека
tmsg db 0x42,0x43,0x44,0x45; сообщение:"BCDE"
;---------------------
; PROGRAM START
;---------------------
ORG BOOTADR ;корректируем адреса
;для указателей
;----------------------
_start:
;---------------------
; init seg ;настраиваем сегментные регистры:
cli ;запрещаем прерывания
mov ax,cx
mov ds,ax ; data на сегмент кода
mov es,ax ; bss тоже
mov ax,STACKSTART ; вычисляем дно стека
sub ax,STACKSIZE ; т.к. он растет
mov ss,ax ; в сторону меньших адресов
mov sp,STACKSTART ; настаиваем вершину стека
sti ; разрешаем прерывания
;----------------------
;установим режим экрана 80x25
mov ah,0x00
mov al,0x03
int 0x10
;----------------------
;поставим курсор в (1,4)
mov ah,0x02
xor bh,bh
mov dh,0x01
mov dl,0x04
int 0x10
;выведем сообщение
mov bx, tmsg ; адрес сообщения
mov cx,0x0004; кол-во символов
mov ah,0x0E
; xor bh,bh
ltmsg: mov al,[bx] ; значение символа
inc bx
int 0x10
loop ltmsg
;зациклим программу
endprog: jmp endprog;
===============================================
-если коментарии гдето ошибочны пожалуйста поправте.
-при загрузке печатает 4 знака мусора из чего предпологаю
что намудрил с адресами сообщения, подскажите где ошибка
-нужно ли запрещать прерывания при настройке сегментов?
-если сделать push ax сразу после настройки сегментов
ax поместится в STACKSTART=0x7B00 или 0x7B00-1?
2) Странный кусок кода:
Код:
Наверное предполагалось не
mov ax,cx
а mov ax, 0
3)
Цитата:
-если сделать push ax сразу после настройки сегментов
ax поместится в STACKSTART=0x7B00 или 0x7B00-1?
ax попадёт в 0x7b00-2 и 0x7b00-1
это значит, что если установить дно стека на 0x7c00, то программа в 0x7c00 затёрта не будет.
Цитата:
; init seg ;настраиваем сегментные регистры:
cli ;запрещаем прерывания
mov ax,cx ; cs - ? Но все равно так не делают!!!
mov ds,ax ; data на сегмент кода
mov es,ax ; bss тоже :D
mov ax,STACKSTART ; вычисляем дно стека
sub ax,STACKSIZE ; т.к. он растет
mov ss,ax ; в сторону меньших адресов
mov sp,STACKSTART ; настаиваем вершину стека
sti ; разрешаем прерывания
cli ;запрещаем прерывания
mov ax,cx ; cs - ? Но все равно так не делают!!!
mov ds,ax ; data на сегмент кода
mov es,ax ; bss тоже :D
mov ax,STACKSTART ; вычисляем дно стека
sub ax,STACKSIZE ; т.к. он растет
mov ss,ax ; в сторону меньших адресов
mov sp,STACKSTART ; настаиваем вершину стека
sti ; разрешаем прерывания
Фигня. Зачем что-то вычислять, когда кругом одни константы, тем более так криво.
Код:
xor ax,ax
cli
mov ss,ax
mov sp,7C00h
sti
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,7C00h
sti
mov ds,ax
mov es,ax
Цитата:
;выведем сообщение
mov bx, tmsg ; адрес сообщения
mov cx,0x0004; кол-во символов
mov ah,0x0E
; xor bh,bh
ltmsg: mov al,[bx] ; значение символа
inc bx
int 0x10
loop ltmsg
mov bx, tmsg ; адрес сообщения
mov cx,0x0004; кол-во символов
mov ah,0x0E
; xor bh,bh
ltmsg: mov al,[bx] ; значение символа
inc bx
int 0x10
loop ltmsg
Фигня. Функция 0Eh использует регистр bx в качестве входного параметра и не гарантирует сохранности регистров ah и cx.
Код:
; Подпрограмма putstr. Вход: ds:si - адрес нольтерминальной строки
; (терминатором также может быть любой символ с кодом > 7Fh)
@@:
mov bx,0007h
mov ah,0Eh
push si
int 10h
pop si
inc si
putstr:
mov al,[si]
and al,al
jg @b
ret
; (терминатором также может быть любой символ с кодом > 7Fh)
@@:
mov bx,0007h
mov ah,0Eh
push si
int 10h
pop si
inc si
putstr:
mov al,[si]
and al,al
jg @b
ret
заработало
мне нужно записать загрузочный сектор на дискету
;кусок проги для чтения с адреса 7e00h дискеты и записи их в оперу
;чтобы прерывание int 13 читало данные с дискеты в ah должно быть 02h
;в регистрах должно быть записано:
;dl номер диска. 00h-диковод А
;dh номер головки
;ch номер цилиндра(дорожки)
;cl номер сектора
;al число секторов для чтения
;es:bx адрес, куда будут считаны данные(es-сектор, bx-смещение)
mov dl,00h
mov dh,00h
mov ch,00h
mov cl,02h
mov al,01h
mov ah,02h
mov bx,7e00h
xor ax,ax ;обнуляем ax
mov es,ax
int 13h
Будет-ли это работать, надо-ли заполнить 510 и 511 байты ???
Какой файл(ехе,сом,bin) и как записать в нулевой сектор дискеты???
Цитата: semforevor
мне нужно записать загрузочный сектор на дискету
...
Какой файл(ехе,сом,bin) и как записать в нулевой сектор дискеты???
Определитесь сначала чего преподаватель задал :)
Для решения первого вопроса существует множество утилит. Можешь даже сделать так:
Пуск > Выполнить...
debug
- N yourdisk:\yourpath\yourfile
- L 7C00
- W 7C00 0 0 1
- Q