Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GCC Inline Assembler & Bios Interrupts 
:(
    Опции темы
Robotex
Дата 20.10.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 5.12.2007

Репутация: нет
Всего: нет



Есть код, помогите до ума довести. Нужна функция для чтения сектора диска в 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(&currentMBR );
PrintSector(currentMBR); //function to print buffer in hex
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Linux/Unix"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Linux/Unix | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.