int 13h ah = 08h, что я делаю не так? - PullRequest
1 голос
/ 24 января 2012

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

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/ это ноль для ах = 0

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

Что я делаю неправильно ??

с использованием эмулятора qemu pc и 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

Ответы [ 3 ]

2 голосов
/ 25 января 2012

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

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

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

2 голосов
/ 24 января 2012

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

0 голосов
/ 28 июня 2014
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

...