Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2017, 22:09   #51
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Nikolay2015 Посмотреть сообщение
А зачем в регистр BX задаётся значение 55AA?
Задаётся в соответствии со спецификацией. Просто на 286 процессорах флаг CF не выставлялся. Вот дополнительная проверка.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 26.08.2017, 22:42   #52
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Данный ниже код работает в виртуалке. Но блин теперь через USB не грузится и ничего не выводит. Я уже задрался.
Код:
use16
org 07c00h ;BIOS передаёт управление на этот адрес, так что программу загрузим по этому адресу
jmp start



stack_adress dw 07c00h

;REAL MODE
start:
   xor eax,eax ;очищаем eax
   mov ss, ax
   mov es, ax
   mov sp, stack_adress
   push sp  ;Указатель стека
   pop ds   ;Указатель на данные

   push dx ; Для любых манипуляций с диском сохраним номер диска в стек
           ; А потом можно будет в переменную

clear_screen: ;Очишаем экран
   xor ah, ah
   mov al, 0
   int 10h

 ;  mov al, 'H'
 ;  mov ah, 09h
;   int 10h

  ; mov bp,Loads
 ;  mov cx,10
 ;  mov dx, 0000h
 ;  call Print_screen

   mov ah, 10h
   mov al, 00h
   mov bl, 0
   mov bh, 9
   int 10h

   mov bp,Loads
   mov cx,10
   mov dx, 0100h
   call Print_screen

check_disk:
   mov ah, 41h
   mov dl, 80h
   mov bx, 55AAh
   int 13h
   jnc ok
   call error
   ret

ok:
   mov bp, Disk_found
   mov cx, 40
   mov dx, 0200h
   call Print_screen

   mov cx ,3
@@:
   mov ah,48h
   pop dx
   mov [dsk], dl
   mov si, buff
   int 13h

   cmp byte[si + 40], 'U' ;USB
   je  @next

@next:
   mov al, [dsk]
   sub al, 50h
   xor bx,bx
   mov cx, 1
   mov ah, 0Ah
   int 10h

   jmp $

error:
   mov bp, Error
   mov cx, 5
   mov dx, 0200h
   call Print_screen
   ret


Print_screen:
   push ax
   mov ax, 1301h
   mov bx, 0Fh
   int 10h
   pop ax
   ret

Loads db 'Loading 10...',0
PressAnyKey  db 'Press any key...',0
Error db 'Error',0

Disk_found db 'Disk found. It`s accept more services...',0

dsk   db ?
buff  db  74, 128 dup(0)

times 0x1fe-($-$$) db 00h
db 55h,0aah ;boot signature
Nikolay2015 вне форума Ответить с цитированием
Старый 29.08.2017, 17:51   #53
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..чтобы сделать флешку загрузочной, отформатируй и сохрани её таблицу разделов.
Для бэкапа, я использовал HEX-редактор HxD. Флэшка у меня 4-гиговая, и её 'Partition Table' выглядит так (сектор нуль, адрес: 01B8h-01FFh):

Код:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------------------------
000001B0                          80 C4 05 00 00 00 80 01  ........ЂД....Ђ.
000001C0  01 00 0B FE 7F EA 3F 00 00 00 C1 6F 78 00 00 00  ...ю.к?...Бox...
000001D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA  ..............UЄ
Таблица описывает 4-раздела диска, каждая запись по 16-байт и начинается с адреса 01BEh. 6-байт с адреса 01B8h - это ID-диска, который назначается при его форматировании, для менеджера дисков винды. Поэтому сохраняем его тоже. Эта таблица должна будет присутствовать в хвосте твоего\512-байного загрузчика. Если байт по адресу (01BEh) имеет значение отличное от 80h, то поставь 80h - это флаг загрузочного раздела.

Моя флэшка имеет 1 раздел, размер которого (в секторах) указан в последнем DWORD'e первой записи, по адресу 01CAh = 00786FC1h. В 10-тичном, всего получается 7.892.929 секторов, ..умножить на 512-байт = 4.041.179.648-байт. Это поле можно использовать в качестве флага присутсвия флэшки в системе, например, чтобы получить номер диска для INT-13h. Хоть BIOS и кладёт в регистр(DL) номер диска, с которого скопировал загрузочный сектор на адрес 0:7С00h - лишняя проверка не помешает..

Остаётся написать сам загрузчик оси, который будет подгружать в память сектор(1) с диска. Ясно, что код оси должен будет находится в этом секторе. Я буду копировать его с диска на адрес 0:1000h:

Код:
;---- Загрузчик в секторе(0) флэшки -----
;----------------------------------------
org  7C00h
jmp  start

Loads    db  'BOOT OK! Press any key for boot OS...',0
err      db  'ERROR!',0

start:   
; настраиваем стек и регистры
;-----------------------------
         xor   ax,ax 
         mov   ss,ax
         mov   sp,7C00h 
         push  0 0 0
         pop   es cs ds
         push  dx            ; запомнить диск для INT-13h..

; ставим режим 80х25 и выводим мессагу
;-------------------------------------
         mov   ax,3
         int   10h

         mov   si,Loads
         call  Print

; читаем сектор(1) на адрес 0:1000h
;-------------------------------------
         pop   dx
         xor   dh,dh   
         mov   ax,0201h
         mov   cx,1
         mov   bx,1000h
         int   13h
         jnc   @ok 

; ошибка копирования!
;-------------------------------------
         mov   si,err
         call  Print
         jmp   $          

; всё ОК! Уходим на адрес 0000:1000h   <-------//-
;-----------------------------------
@ok:     push  0 1000h 
         retf

;========================================
Print:   mov   ah,13h
         mov   bl,0Fh
@@:      lodsb
         or    al,al
         je    @f
         int   10h
         jmp   @b
@@:      ret
;========================================

times    01B8h - ($-$$) db 00h
         
PTable   db    80h,0C4h,05h,00h,00h,00h 
         db    80h,01h,01h,00h,0Bh,0FEh,7Fh,0EAh,3Fh,00h,00h,00h,0C1h,6Fh,78h,00
         db    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
         db    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
         db    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
         db    55h,0AAh
После компиляции, получишь бинарник размером 512-байт, который нужно записать в сектор(0) флэшки. Сделать это можно прямо HEX-редактором HxD простым копированием содержимого бинарника. Теперь в начале кода оси указываешь 'ORG 1000h' и кидаешь её в сектор(1). Поскольку проверки на флэшку тут нет, значит нужно в биос выбирать загрузочное устройство по (F9-F12).
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прерывания kolyan147 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 13.06.2012 23:55
прерывания lilek Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 14.12.2010 20:44
Прерывания alexdrew Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 16.05.2010 00:38
Прерывания Kn793 Общие вопросы Delphi 3 10.01.2009 18:43