int 13h ah=08h Что я делаю не так?

хорошо, так что это мой код ..

mov ah,08h
mov dl,80h ;have Tried for 81h,82h....
int 13h


mov ah,0Eh
    int 10h ;  printing the value in al.

int 10h выводит на экран символ ascii

после загрузки результатом всегда является «символ смайлика ascii» для всего, включая 80h, 81h, 82h.. экран вывода здесь http://postimage.org/image/5twm1ml5j/ значение null для ah=0

я подключил жесткие диски, USB к своему ноутбуку, прежде чем попробовать ...

Что я делаю не так??

с помощью эмулятора ПК qemu и nasm

Это весь мой код.

    BITS 16

start:
mov ax, 1984    ; Set up 4K stack space after this bootloader
add ax, 288     ; (4096 + 512) / 16 bytes per paragraph
mov ss, ax
mov sp, 4096

mov ax, 1984        ; Set data segment to where we're loaded
mov ds, ax




mov ah,08h
mov dl,80h
int 13h


mov ah,0Eh
int 10h








times 510-($-$$) db 0   ; Pad remainder of boot sector with 0s
dw 0xAA55       ; The standard PC boot signature

person Community    schedule 24.01.2012    source источник
comment
Вот рабочий код загрузчика, который я написал около 20 лет назад: gist.github.com/546634   -  person Sedat Kapanoglu    schedule 26.01.2012


Ответы (3)


Почему вы звоните в int 13h? Это для дисковых служб, в частности, с ah=08h вы запрашиваете параметры первого диска! (отметьте здесь).
Затем вы перемещаете все, что находится в ах (одной из этих наверняка) в al, который является символом для печати. Напечатанное лицо представляет собой символ ascii номер 1, поэтому, посмотрев здесь, вы снова указали неправильные параметры для 13ч. ;)

person BlackBear    schedule 24.01.2012
comment
мне нужны параметры диска!.. головная дорожка и секторы.... есть идеи, почему я всегда получаю 01 в качестве возврата? подскажите правильные параметры? - person wolfgang; 24.01.2012
comment
@TejeshWayne: ah всегда содержит 01h, а al содержит статус. Другие регистры содержат информацию, которую вы ищете (проверьте мою первую ссылку) - person BlackBear; 24.01.2012
comment
извините за мою ошибку! .. теперь понял :) спасибо BlackBear однако .. когда я печатаю значение в al .. я получаю это postimage.org/image/fg69cd0wn, который, как я предполагаю, является кодом ascii 192.. есть идеи, почему? - person wolfgang; 24.01.2012
comment
получить одинаковый код ascii для всех дисков 80h,81,82... мой код.. mov ah,08h mov dl,80h int 13h mov ah,0Eh int 10h - person wolfgang; 24.01.2012
comment
@TejeshWayne: проверьте флаг переноса. Если он установлен, то есть проблема - person BlackBear; 24.01.2012
comment
внес это изменение.. pastebin.com/rMX4P9je для печати флага переноса и моего вывода: postimage.org/image/hukhpu6pv, что, вероятно, является нулевым или пробелом.. я был бы рад, если бы вы могли написать небольшой код для меня, чтобы попробовать .. для int 13h - person wolfgang; 25.01.2012
comment
попробовал int 13h ah=01h для состояния диска.. напечатал al, и это то же самое, что и предыдущий вывод - person wolfgang; 25.01.2012

Во-первых, всегда запускайте загрузчик с «jmp» (требуется в некоторых старых системах Compaq вместо «загрузочной подписи»), отключайте IRQ при загрузке SS и SP (в случае, если ЦП 8086), никогда не записывайте адреса и сегменты в десятичный (используйте шестнадцатеричный), BIOS сообщает вам номер устройства в DL (не «жестко кодируйте» свой собственный), и вы не должны позволять процессору выполнять данные/мусор (поставьте «jmp $» или что-то еще после "целое 0x10").

Далее, «символ смайлика ASCII» не является символом ASCII. Для набора символов «кодовая страница 437» (то, что вы, вероятно, видите) есть 2 разных символа смайлика — контур смайлика (символ 0x01) и сплошной смайлик (символ 0x02). Они будут соответствовать кодам ошибок «0x01 = неверная функция в AH или неверный параметр» или «0x02 = адресная метка не найдена». Первая ошибка гораздо более вероятна.

Ошибка «недопустимая функция в AH или недопустимый параметр» может быть вызвана неверным значением в DL (например, неверным номером устройства). Кроме того, номер устройства может быть правильным, но функция может не поддерживаться для этого устройства. Из-за проблем с размером диска старые функции «int 0x13» больше не используются для жестких дисков (они ограничены 1024 цилиндрами, 256 головками и 63 секторами, или около 7,875 ГиБ или 8,455 ГБ, а современные жесткие диски намного больше). крупнее). Для жестких дисков вместо этого следует попробовать «расширения int 0x13», в частности, «int 0x13, ah=0x48» (см. http://www.ctyme.com/intr/rb-0715.htm).

person Brendan    schedule 25.01.2012
comment
@Brendan Спасибо за ответ :), я пытался использовать int 13h & ah=48h, и когда я печатаю регистр al, это код ascii 192 или C0h .. К сожалению, для этого не указан код ошибки .. :-/ вот он это postimage.org/image/fg69cd0wn .. и мой код здесь pastebin.com/M7JTfDHC Я был бы рад, если бы вы написали небольшой код в int 13h.. который я мог бы попробовать :) - person wolfgang; 25.01.2012
comment
@Tejesh: BIOS возвращает статус в AH, но вы показываете AL. Вот кое-что, что я все равно собрал вместе: pastebin.com/BEnjfwBs - person Brendan; 26.01.2012

INT 13h AH=08h: Read Drive Parameters
Parameters:

Registers
AH  08h = function number for read_drive_parameters
DL  drive index (e.g. 1st HDD = 80h)
ES:DI[4]    set to 0000h:0000h to work around some buggy BIOS

Results:

CF  Set On Error, Clear If No Error
AH  Return Code
DL  number of hard disk drives
DH[4]   logical last index of heads = number_of - 1 (because index starts with 0)
CX  [7:6] [15:8][4] logical last index of cylinders = number_of - 1 (because index starts with 0)
[5:0][4] logical last index of sectors per track = number_of (because index starts with 1)

BL[4]   drive type (only AT/PS2 floppies)
ES:DI[4]    pointer to drive parameter table (only for floppies)

http://en.wikipedia.org/wiki/INT_13H

person Srs    schedule 28.06.2014