Я пытаюсь узнать сборку в режиме реального .Я хотел, чтобы прочитать загрузочный сектор жесткого диска, поэтому ниже кодзагрузочный сектор чтения жесткого диска
org 100h
start:
xor ax, ax
mov es, ax ; ES <- 0
mov cx, 1 ; cylinder 0, sector 1
mov dx, 0080h ; DH = 0 (head), drive = 80h (0th hard disk)
mov bx, buff ; segment offset of the buffer
mov ax, 0201h ; AH = 02 (disk read), AL = 01 (number of sectors to read)
int 13h
jnc .read
.read:
mov ax, cs ; set up segments
mov ds, ax
mov es, ax
mov al, 03h
mov ah, 0
int 10h
mov si, buff
call print_string
.done:
jmp .done
print_string:
lodsb ; grab a byte from SI
test al, al ; logical or AL by itself
jz .done ; if the result is zero, get out
mov ah, 0x0E
int 0x10 ; otherwise, print out the character!
jmp print_string
.done:
ret
buff dw 512
Моя среда исполнение DosBox0. 70 и exe файл .COM. Я ожидаю увидеть 512 байт на экране, но когда я запустил свой .COM-файл, его просто пустой экран. Есть несколько причин, которые я мог видеть за ним.
1) Дается код, который не возвращается из прерывания Bios должным образом (int 13h). 2) Строка должна заканчиваться нулем, что здесь не происходит.
Но не уверен, что это причины, по которым это происходит, и если да, то как я могу реанимировать тезисы вопросов?
Попробуйте 'mov bx, offset buff' –
@EgorSkriptunoff: Код выглядит так, как будто он был написан для NASM, у которого нет/требуется ключевое слово' offset'. – Michael
Весьма вероятно, что загрузочный сектор содержит байты, которые выходят за пределы диапазона печати в таблице ASCII (и что он содержит байты со значением 0).Вместо использования функции print_string попробуйте написать функцию, которая печатает каждый байт в виде двух шестнадцатеричных цифр и повторяет это 512 раз. Кстати, вы заявили, что ваш буфер имеет место для 1024 байта (512 слов). – Michael