Есть тут программисты, которые разбираются в ассемблере?
Есть код, помогите до ума довести. Нужна функция для чтения сектора диска в LBA режиме с помощью прерываний. Вот наклепал немного, но знаний пока не хватает, чтобы самому доделать... А функция нужна срочно...
#include <stdio.h>
#define FP_SEG(fptr) ((unsigned)((unsigned long)(fptr) >> 16))
#define FP_OFF(fptr) ((unsigned)(fptr))
#define BYTE unsigned char
#define WORD unsigned short
#define DWORD unsigned int
#define SECTOR_SIZE 512
struct disk_packet //needed for int13 42h
{
BYTE size_pack; //size of packet must be 16 or 16+
BYTE reserved1; //reserved
BYTE no_of_blocks; //nof blocks for transfer
BYTE reserved2; //reserved
WORD offset; //offset address
WORD segment; //segment address
DWORD lba1;
DWORD lba2;
} disk_pack;
void LBASectorRead(void *buffer/*, unsigned long lba */)
{
unsigned char bError = 0;
disk_pack.size_pack=16; //set size to 16
disk_pack.no_of_blocks=1; //1 block ie read one sector
disk_pack.reserved1=0; //reserved word
disk_pack.reserved2=0; //reserved word
disk_pack.segment=FP_SEG(buffer); //segment of buffer
disk_pack.offset=FP_OFF(buffer); //offset of buffer
disk_pack.lba1=0; //lba first 32 bits
disk_pack.lba2=0; //last 32 bit address
asm(".intel_syntax noprefix \n\t"
"mov dl, 0x80 \n\t"
"mov %1, ds \n\t"
"mov si, %3 \n\t"
"mov ah, 0x42 \n\t"
"int 0x13 \n\t"
".att_syntax noprefix \n\t");
/*_asm
{
mov dl, 80h;
mov [disk_pack.segment], ds;
mov si, disk_pack;
mov ah, 42h;
int 13h
jc NoError ; //No error, ignore error code
mov bError, ah ; // Error, get the error code
NoError:
}
printf( "%d", bError);*/
}
void PrintSector(char * buffer)
{
int i;
for(i = 0; i < SECTOR_SIZE; i++)
{
printf("%d ", *(buffer+i));
if((i+1)%12==0) printf("\n");
}
printf("\n");
}
int main(void)
{
static unsigned char currentMBR[SECTOR_SIZE] = {0};
printf("\n\n");
LBASectorRead(¤tMBR );
PrintSector(currentMBR); //function to print buffer in hex
}