Привет всем любителям!
Я создаю программу для загрузки с флешки через BIOS.
Нашёл такой
Пример
proc GetCPUString lpBuff:DWORD, dFixString:DWORD
pusha
; Указатель на строку-приемник
mov esi,[lpBuff]
mov edi,esi
cld
; Прочитать информацию о процессоре
mov eax,80000002h
@@:
push eax
cpuid
stosd
xchg eax,ebx
stosd
xchg eax,ecx
stosd
xchg eax,edx
stosd
pop eax
inc eax
cmp eax,80000004h
jbe @b
; Привести строку к формату ASCIIZ
xor eax,eax
stosb
; Нужно ли чистить строку?
cmp [dFixString],0
je .loc_ret
; Почистить строку от лишних и неправильных символов
mov edi,esi
@@:
; Убрать лидирующие пробелы, если они есть
cmp byte [esi],' '
jne @f
inc esi
jmp @b
@@:
xor ebx,ebx
.loc_clean_string:
lodsb
cmp al,' '
jnz @f
; Убрать повторяющиеся пробелы
cmp bl,1
je .loc_clean_string
; Установить флажок, что начались пробелы
mov bl,1
jmp .loc_store_char
@@:
; Сбросить флажок пробелов
mov bl,0
; Преобразовать символы "(R)" в один
cmp al,'('
jne @f
cmp word [esi],'R)'
jne @f
; ESI + 2
lodsw
; Символ (R)
mov al,0AEh
jmp .loc_store_char
@@:
; Преобразовать символы "(TM)" в один
cmp dword [esi-1],'(TM)'
je @f
; Написание может быть различным
cmp dword [esi-1],'(tm)'
jne .loc_store_char
@@:
; ESI + 3
lodsw
lodsb
; Символ (TM)
mov al,099h
.loc_store_char:
; Записать символ в строку
stosb
; Конец строки достигнут?
or al,al
jnz .loc_clean_string
; Удалить финальный пробел если есть
cmp byte [edi-1],' '
jne .loc_ret
mov byte [edi-1],0
.loc_ret:
popa
ret
endp
Но он похоже не для FASM да и без комментариев.
Прошу сердечно адаптировать его под FASM конкретно для BIOS.
Пожалуйста прокомментируйте каждую строчку.
Само ядро готово, желательно оформить код в виде функции.
Вот что у меня есть на данный момент
;FASM###########################################################################################################################################################################
org 7c00h ;BIOS производит чтение 512 байт первого сектора MBR в ОЗУ по адресу 0x00007C00
;(0x07C0:0x0000 в формате реального режима), затем прочитанному коду передаётся управление
;Точка входа###############################################################################################################################################################
start:
cli ;запрещаем прерывания
xor ax,ax ;обнуляем регистр ах
mov ds,ax ;настраиваем сегмент данных на нулевой адрес
mov es,ax ;настраиваем сегмент es на нулевой адрес
mov ss,ax ;настраиваем сегмент стека на нулевой адрес
mov sp,07C00h ;сегмент sp указывает на текущую вершину стека
sti ;разрешаем прерывания
;Настройка экрана###############################################################################################################################################################
mov ax, 03h ;
int 10h ;прерывания 10h
;Основная программа#############################################################################################################################################################
call user_print_title ;call вызов функции
mov ax, 1301h ;функция 13h прерывания 10h
int 10h
call user_print_author
mov ax, 1301h ;функция 13h прерывания 10h
int 10h
call user_print_continue
mov ax, 1301h ;функция 13h прерывания 10h
int 10h
call user_print_cpu_info
mov ax, 1301h ;функция 13h прерывания 10h
int 10h
jmp $
;Подпрограммы###################################################################################################################################################################
user_print_cpu_info:
; указатель на строку
mov esi, cpu_info
mov edi,esi
cld
; прочитать информацию о процессоре
mov eax, 80000002h
push eax
stosd
xchg eax,ebx
stosd
xchg eax,ecx
stosd
xchg eax,edx
stosd
pop eax
inc eax
cmp eax,80000004h
;настройка печати
mov cx, 24 ;cx количество выводимых символов
mov bx, 50h ;bx 0 цвет фона, 9 цвет текста
mov dx, 0100h ;dx кординаты где вставить курсор y=00, x=00
mov bp, cpu_info ;bp вывод строки
ret
user_print_title:
mov cx, 26 ;cx количество выводимых символов
mov bx, 09h ;bx 0 цвет фона, 9 цвет текста
mov dx, 0019h ;dx кординаты где вставить курсор y=00, x=00
mov bp, title ;bp вывод строки
ret
;*******************************************************************************************************************************************************************************
user_print_author:
mov cx, 24 ;cx количество выводимых символов
mov bx, 50h ;bx 0 цвет фона, 9 цвет текста
mov dx, 1738h ;dx кординаты где вставить курсор y=00, x=00
mov bp, author ;bp вывод строки
ret
;*********************************************************************************************************************************************************************
user_print_continue:
mov cx, 26 ;cx количество выводимых символов
mov bx, 06h ;bx 0 цвет фона, 9 цвет текста
mov dx, 1700h ;dx кординаты где вставить курсор y=00, x=00
mov bp, continue ;bp вывод строки
ret
title db '<<<Hardware information>>>', 0
continue db 'Press Enter to continue...', 0
cpu_info db 100, "$"
times(512-2-($-07C00h)) db 0 ;остатки пространства заполнить нолями
db 055h,0AAh ;сигнатура, символизирующая о завершении загрузочного сектора