USE16
org 0x7C00
start:
xor eax, eax
xor esi, esi
xor edi, edi
mov ds, ax
mov es, ax
mov bp, 0x7c00
mov ax, 0x0003
int 0x10
mov si, msg_Load
call print_string_16
jmp 0x0000:0x8000
print_string_16:
pusha
mov ah, 0x0E
.repeat:
lodsb
cmp al, 0
je .done
int 0x10
jmp short .repeat
.done:
popa
ret
msg_Load db "Hello World!", 0
mov ah,0
int 16h
times 510-$+$$ db 0
sign dw 0xAA55
times 512-$+$$ db 0
;---установка времени
MOV CH,HOURS ;вводим значения времени
MOV CL,MINUTES ;
MOV DH,SECONDS ;
MOV DL,HUNDREDTHS ;
MOV AH,2DH ;номер функции установки времени
INT 21H ;устанавливаем время
CMP AH,0FFH ;проверяем правильность значения
JE ERROR ;переход на обработку ошибки
;---получение времени
MOV AH,2CH ;номер функции получения времени
INT 21H ;получаем время
MOV DAY_OF_WEEK,AH ;получаем день недели из AH
Разработать программу, работающую в реальном режиме, располагающуюся в загрузочном секторе носителя (дискета, usb-flash, жесткий диск) и выполняющую операцию считывание заданных параметров и вывод на экран в заданной форме с последующим вводом и установкой:
Считывание и установка минут и секунд
Формат считывания: Десятичный;
Формат установки: Шестнадцатиричный.
Пока с MBR не особо понятно. Попробую разобраться.
Смещение Длина Описание
000h 446 Код загрузчика
1BEh 64 Таблица разделов
16 Раздел 1
1CEh 16 Раздел 2
1DEh 16 Раздел 3
1EEh 16 Раздел 4
1FEh 2 Сигнатура (55h AAh)
Смещение Длина Описание
00h 1 Признак активности раздела
01h 1 Начало раздела — головка
02h 1 Начало раздела — сектор (биты 0—5), цилиндр (биты 6, 7)
03h 1 Начало раздела — цилиндр (старшие биты 8, 9 хранятся в байте номера сектора)
04h 1 Код типа раздела
05h 1 Конец раздела — головка
06h 1 Конец раздела — сектор (биты 0—5), цилиндр (биты 6, 7)
07h 1 Конец раздела — цилиндр (старшие биты 8, 9 хранятся в байте номера сектора)
08h 4 Смещение первого сектора
0Ch 4 Количество секторов раздела
То, о чем я говорил:
Формируется не загрузочный диск, без активных разделов.
Как сделать ввод чисел в 16-ричной форме?
Удалось записать загрузчик на флешку. Флешка работает только если с него загружаться, а сама оперционка ее прочитать не может... Файловую систему чтоль повредил...
Секунды, правда, не отображаются. Показывает все время 0, но я нашел ошибку
;
mov al,dh;теперь секунды
call BCD2ASCII;см. выше
но те же результаты... Ниже сам код подпрограммы
mov bx,16;система счисления
mov bx,07
В коде меняется система счисления. Единственный выход использовать ещё не используемый регистр SI как указатель системы счисления, для этого нужно заменить его в строках:
mov bx,16
mul bx
mov ah,0Eh
mov bx,07;--------------
int 10h
Теперь не вижу что ввожу
Может надо переводить в BCD?
Введение такого кода заставляет дополнительно заниматся подготовкой данных для функции BIOS, т.к. там на входе должен быть BCD-код.
hext2BCD:
;input: ax HEXT code
;output: ax BCD code
xor cx,cx
mov si,10;тут была ошибка: 10 а не 16
H2B: xor dx,dx
div si
inc cx
push dx
or ax,ax
jnz H2B
;
;
B2H:
shl ax,4
pop dx
or ax,dx
loop B2H
ret
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.