Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

собственный загрузчик

11K
22 августа 2008 года
zxc
11 / / 28.10.2005
здравсвуйте, заинересовался написанием собственного
загрузчика, решил попробовать в целях узнать чтото новое,
полазил по инету, почитал, в итоге родился такой код,
пытающийся вывести несколько символов
компилил так: 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?
360
22 августа 2008 года
P*t*
474 / / 15.02.2007
1) запрещать прерывания не нужно.
2) Странный кусок кода:
 
Код:
; init seg ;настраиваем сегментные регистры:
cli ;запрещаем прерывания
[COLOR="Red"]mov ax,cx[/COLOR]
mov ds,ax ; data на сегмент кода
mov es,ax ; bss тоже

Наверное предполагалось не
mov ax,cx
а mov ax, 0

3)
Цитата:

-если сделать push ax сразу после настройки сегментов
ax поместится в STACKSTART=0x7B00 или 0x7B00-1?


ax попадёт в 0x7b00-2 и 0x7b00-1
это значит, что если установить дно стека на 0x7c00, то программа в 0x7c00 затёрта не будет.

349
23 августа 2008 года
Phantom-84
656 / / 27.10.2005
Цитата:
; 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 ; разрешаем прерывания


Фигня. Зачем что-то вычислять, когда кругом одни константы, тем более так криво.

 
Код:
xor ax,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


Фигня. Функция 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
11K
26 августа 2008 года
zxc
11 / / 28.10.2005
спасибо
заработало
42K
06 сентября 2008 года
semforevor
1 / / 06.09.2008
Пожалуйста помогите начинающему.:confused:
мне нужно записать загрузочный сектор на дискету


;кусок проги для чтения с адреса 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) и как записать в нулевой сектор дискеты???
14
08 сентября 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: semforevor

мне нужно записать загрузочный сектор на дискету

...

Какой файл(ехе,сом,bin) и как записать в нулевой сектор дискеты???



Определитесь сначала чего преподаватель задал :)

349
08 сентября 2008 года
Phantom-84
656 / / 27.10.2005
На последние вопросы тебе уже ответили на wasm.ru
Для решения первого вопроса существует множество утилит. Можешь даже сделать так:
Пуск > Выполнить...
debug
- N yourdisk:\yourpath\yourfile
- L 7C00
- W 7C00 0 0 1
- Q
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог