Последние записи
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
2nd
Окт
Запись загрузчика на флешку. В первых 512 байт (бут сектор)
Posted by Chas under assembler, Пост-обзор
Ребята помогите с записью загрузчика на флешку!
как его запихнуть в первые 509 байт?
и как в 510, 511 байт пихнуть 55aa, соответственно.
alexcoder
пример на фасм:
org 07C00h
USE16
main:
cli
lgdt [cs:GDTR] ; Загрузка адреса глобальной таблицы дескрипторов
mov eax, cr0 ; Переключение в защищенный режим
or al,1
mov cr0,eax
jmp CODE_SELECTOR:pm_start
NULL_SELECTOR = 0 ; Нулевой селектор
CODE_SELECTOR = 1 shl 3 ; Селектор кода
DATA_SELECTOR = 2 shl 3 ; Селектор данных
VIDEO_SELECTOR = 3 shl 3 ; Селектор буфера видеопамяти
GDTR: ; Global Descriptors Table Register
dw 4*8-1 ; Размер GDT
dq GDT ; Смещение GDT
GDT:
; нулевой дескриптор (обязательно должен присутствовать в GDT!)
NULL_descr db 8 dup (0)
; дескриптор 32-разрядного сегмента кода: база = 00000000h, размер = FFFFFFFFh
CODE_descr db 0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b , 00h
; дескриптор 32-разрядного сегмента данных: база = 00000000h, размер = FFFFFFFFh
DATA_descr db 0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b , 00h
; дескриптор сегмента видеопамяти: база = 000B8000h, размер = 0000FFFFh
VIDEO_descr db 0FFh, 0FFh, 00h, 80h, 0Bh, 10010010b, 01000000b , 00h
;Этот код исполняется в защищенном режиме
;=======================================================;
USE32
pm_start:
mov AX, VIDEO_SELECTOR ; селектор на третий дескриптор (VIDEO_descr)
mov ES, AX ; а этого в ES
mov AX, DATA_SELECTOR
mov DS, AX
;Счетчик символов для вывода на экран
mov di, 0
call print_date
call read_and_set_date
call print_date
exit_:
; завешиваем компьютер
hlt
;Печать значения часа и минут
print_date:
; "hour:"
mov bx, str_hour
call print_string
; Значение часа
mov al, 04H
out 70H, al ;выбрать адрес CMOS 04H
jmp $+2 ;требуется небольшая задержка
in al, 71H ;теперь в AL искомое значение
call bcd_to_dec
mov cx, ax
call print_dec
; Новая строка
call print_new_line
; "min:"
mov bx, str_min
call print_string
; Значение минут
mov al, 02H
out 70H, al ;выбрать адрес CMOS 02H
jmp $+2 ;требуется небольшая задержка
in al, 71H ;теперь в AL искомое значение
call bcd_to_dec
mov cx, ax
mov ah, 0Eh
call print_dec
; Новая строка
call print_new_line
ret;
;Преобразование BCD-кода в DEC
bcd_to_dec:
;перенос старшей цифры в ah
mov ah, al
shr ah, 4
and al, 0Fh
;команда принимает в ah старшую цифру, в al - младшую
add ax,3030h ;преобразование в ASCII
ret
;Преобразование HEX в BCD-код
hex_to_bcd:
mov ah, 0
;команда помещает старшую цифру в ah
aam
;объединение ah и al
shl ah, 4
or al, ah
ret
;процедура вывода 2-х значного десятичного числа на экран
;Число передается в cх
print_dec:
;старшая цифра
mov al, ch
call print_char
;младшая цифра
mov al, cl
call print_char
ret
;вывод на экран строки, оканчивающейся нулем
;адрес сроки передается в ds:bx
;адрес видеопамяти передается в es:di
print_string:
mov ah, 0
; вывод текущего знака
.char:
mov al,[bx]
inc bx
;окончание строки на нулевом символе
test al,al
jz .ret
;Вывод символа
call print_char
jmp .char
.ret:
ret
; Перевод строки
; Для этого указатель di устанавливается на следующее занчение, кратное 160
; размер экрана 80х25, по 2 байта на символ
;новое значение высчитыватся по формуле: di = 160 * ( ( di / 160 ) + 1 )
print_new_line:
; di / 160
mov ax, di
mov bl, 160
div bl
; ( di / 160 ) + 1
inc al
; 160 * ( ( di / 160 ) + 1 )
mul bl
mov di, ax
ret;
; Вывод одного символа на экран
print_char:
;цвет - белый по черному
mov ah, 0Fh
;вывод
mov [es:di], ax
;смещение в следующую позицию
add di, 2
ret
; Чтение из консоли даты и установка в CMOS
read_and_set_date:
; "hour:"
mov bx, str_hour
call print_string
; Значение часа
call read_six_bits
mov al, 04H
out 70H, al ;выбрать адрес CMOS 04H
mov al, bl
call hex_to_bcd
out 71H, al ;отправка нового значения в порт
; Перенос строки
call print_new_line
; "min:"
mov bx, str_min
call print_string
; Значение дня
call read_six_bits
mov al, 02H
out 70H, al ;выбрать адрес CMOS 02H
mov al, bl
call hex_to_bcd
out 71H, al ;отправка нового значения в порт
; Перенос строки
call print_new_line
ret
;считывание до 6-ти двоичных цифр
;закончить ввод можно клавишей enter
;результат в bl
read_six_bits:
;результат
mov bl, 0
;счетчик цифр
mov cx, 6
;операция считывания
;считываем из порта 64 состояние
;при установке младшего бита в 1 произошло нажатиие
.wait:
in al, 64h
test al, 1h
jz .wait
;scan-код нажатия получаем из порта 60
in al, 60h
cmp al, 1ch ;Скан-код enter?
je .fin ;тогда закончить ввод
cmp al, 02 ;Скан-код единицы?
je .one ;тогда заносим в al 1
cmp al, 0bh ;Скан-код ноля?
je .zero ;тогда заносим в al 0
jmp .wait
.one: mov al,1 ;заносим в al 1
jmp .nxt
.zero: mov al,0 ;заносим в al 0
;учитываем считанное значение в результат
.nxt: shl bl, 1
or bl, al
; код функции вывода на экран
add al, '0'
call print_char
;переходим к следующей цифре
dec cx
jnz .wait
.fin:
ret
; СТРОКИ
str_hour db 'HOUR:',0
str_min db 'MIN:',0
; эта директива заставляет компилятор заполнить оставшееся (до 512-и байт) место нулями
times 510-($-main) db 0
; а эти два байта нужны чтобы биос определил что это действительно
; бут сектор
dw 0xAA55
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)