Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Курсач по ТОС

29K
04 октября 2008 года
Robotex
47 / / 02.10.2008
Делаю курсач по операционным системам. Пишу ОС. Застопорился на файловой системе: как прочитать кластер с диска и как записать информацию в кластер? Можно примеры на NASM ассемблере?
Да и вот какое дело: если я пишу функцию на асме и объявляю ее глобальной, то как потом в С, ей параметры передать?
14
06 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Кластер - набор секторов. Сектора читаются/пишутся 13-ми прерываниями. Ну или через порты ЖД. Пример на nasm имхо не будет сильно отличаться от любого другого что можно найти, к примеру, на wasm.ru
Связь C-Asm как организуешь?
29K
06 октября 2008 года
Robotex
47 / / 02.10.2008
Поначалу думал использовать встроенный ассемблер gcc. Но какой-то он мутный, да и некоторые глюки заметил. Думаю лучше определять глобальные функции в NASM-коде, а в C-прототипы и линковать их вместе...
14
07 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Если будешь линковать obj-и (короче объектные модули), то суть такая: в асме делаешь процедру доступной извне (синтаксис nasm к сожалению не знаю, но в документации должно быть) а в C-коде объявляешь декларацию функции, со всеми ее параметрами и конвенцией вызова и как расположенную во внешнем модуле. Линкеру параметрами задаешь подключить nasm-овский модуль
29K
08 октября 2008 года
Robotex
47 / / 02.10.2008
А как НАСМ поймет какой параметр в какой регистр писать, и что возвращать?
14
08 октября 2008 года
Phodopus
3.3K / / 19.06.2008
А насм понимать ничего и не должен - должен понимать C. C это понимает через указанную конвенцию вызова, о чем я и говорю (ну или cdecl по дефолту). В насме как программист напишет, так оно и будет.. :) Хотя высокоуровневый синтаксис MASM позволял (может и у насма такое есть?) указывать дефолтовую конвенцию вызовов процедур в директиве .model, например:
 
Код:
.model flat, stdcall

но никто после этого не мешает писать в коде процедуры всех остальных конвенций вызова, самостоятельно разбирая местоположение параметров в них. Разве что с директивой слегка проще..
29K
10 октября 2008 года
Robotex
47 / / 02.10.2008
Что-то не совсем ясно... Давай на примере.

Вот к примеру есть функция на асме:

global _increment
_increment:
add eax, 1
ret

Тогда в С указываем прототип

increment(int i)

и можно вызывать функцию?
14
10 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Прототип должен иметь конвенцию. Иначе он cdecl. А в asm-е ты обращаешься к параметру по правилам смахивающим на борландовский fastcall. Так что или в асме через стек параметры извлекай или прототим должным образом объяви.
29K
10 октября 2008 года
Robotex
47 / / 02.10.2008
Цитата: Phodopus
Прототип должен иметь конвенцию. Иначе он cdecl. А в asm-е ты обращаешься к параметру по правилам смахивающим на борландовский fastcall. Так что или в асме через стек параметры извлекай или прототим должным образом объяви.



я учу ассемблер всего месяц, так что мало что понял )) как должным образом прототип объявить?

Если извлекать параметры из стека, то код выглядит так?

global _increment
_increment:
pop eax
add eax, 1
ret

И в С указываем прототип

increment(int i)

Оно?

29K
10 октября 2008 года
Robotex
47 / / 02.10.2008
Так оно вызывает segmentation fault
260
11 октября 2008 года
Ramon
1.1K / / 16.08.2003
вы подняли из стека ип прибавили к нему единицу и вернулись из ф-ции по параметру
29K
11 октября 2008 года
Robotex
47 / / 02.10.2008
Цитата: Ramon
вы подняли из стека ип прибавили к нему единицу и вернулись из ф-ции по параметру


а можно так чтоб я понял? )))))) Что значит вернулся по параметру? И почему ip? Я ведь передавал при вызове i? Разве его не поместило в стек?

14
13 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Почитайте это. Пусть там борлад си и тасм - общие принципы те же. Многие вопросы отпадут. Как осмыслите - возвращайтесь :)
И вот это тоже будет полезно.
29K
15 октября 2008 года
Robotex
47 / / 02.10.2008
Вот нашел интересный код для чтения секторов с диска, но в нем ошибка. Не поможете исправить (а заодно и портировать на linux gcc)?
Цитата:
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
{
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);

}

int main(void)
{
static unsigned char currentMBR[SECTOR_SIZE] = {0};
printf("\n\n");
LBASectorRead(currentMBR );
PrintSector(currentMBR); //function to print buffer in hex
}

14
16 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Я в линуксе ни гу-гу, но помоему там достаточно открыть файл /dev/hda и читать оттуда. Также очччень не уверен что ядро линукса позволяет вызывать прерывания.
29K
16 октября 2008 года
Robotex
47 / / 02.10.2008
Цитата: Phodopus
Я в линуксе ни гу-гу, но помоему там достаточно открыть файл /dev/hda и читать оттуда. Также очччень не уверен что ядро линукса позволяет вызывать прерывания.


Ядро позволяет вызывать прерывания...
Читать из /dev/hda нельзя, ибо я пишу СВОЮ ОСь. А там я такой файл пока не реализовал.
Когда говорил, что нужно портировать под linux, подразумевал сишный код (ассемблерные вставки в gcc по другому выглядят, да и типов BYTE, WORD, DWORD нету, нужно создать файл, где они будут определены).

Это собственная ОСь, поэтому нельзя пользоваться чужими файлами и нельзя подключать библиотеки

14
16 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: Robotex
Это собственная ОСь...


Это я понял, мне просто показалось что вы хотите линуксом прочитать сектор - вот и предложил другой метод. Тогда объясните что не работает в данном примере, а то у меня линукса с GCC под рукой нету. На первый взляд LBA-пакет корректно заполняется и прерывание корректно вызывается. Если это не так, можно найти документацию по этому прерыванию, проверить.

29K
19 октября 2008 года
Robotex
47 / / 02.10.2008
Вот, переписал. Записал в mbr. Выдает сообщение об ошибке... Почему данные не считываются?

Код:
Вот переделал. Код работает, но почему то не считывает... Ошибку выбивает (( В чем проблема?

section .data

  msg_error db "Error!"
 
  dap:
    packet_size db 10h
    reserved    db 00h
    N_SEC       dw 01h
    buff_seg    dw 00h
    buff_off    dw buff
    X_SEC       dd 0
                dd 0

section .bss

  buff resb 512

section .text

  global _start

  _error:

    mov al, 0x28
    call _kputchar
    jmp _exit
   
  _kputchar:
    pusha
    mov ah, 0x0E
    int 0x10
    popa
    ret

  _start:

    mov ah, 42h
    mov dl, 80h
    mov si, dap
    int 13h
    jc _error
   
    mov ah, 0x0E
    mov al, 0x29
    int 0x10
   
  _exit: jmp _exit
29K
20 октября 2008 года
Robotex
47 / / 02.10.2008
Ну неужели никто не разбирается в прерываниях биоса?
14
20 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: Robotex
Вот, переписал. Записал в mbr. Выдает сообщение об ошибке... Почему данные не считываются?


Что именно ты записал в mbr? Давай тогда уж дамп отдельным файлом..

Цитата: Robotex

Ну неужели никто не разбирается в прерываниях биоса?


Зачем в них разбираться когда есть справочник?

29K
20 октября 2008 года
Robotex
47 / / 02.10.2008
Да справочник, то есть, но как видишь нужно еще уметь им пользоваться... Вот диск к примеру не читается
29K
20 октября 2008 года
Robotex
47 / / 02.10.2008
Поковырял тот сырец. Вроде поправил все, кроме ассемблерной вставки. Не знаю я Inline Assembler

Код:
#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
}
29K
23 октября 2008 года
Robotex
47 / / 02.10.2008
Считал в реальном режиме:
Код:
[ORG 0x7C00]

section .text

xor ax,ax
mov ds,ax
mov es,ax

_start:
mov ah, 42h
mov dl, 81h
mov si, dap
int 13h
jc _error

mov ah, 0x0E
mov al, 0x29
int 0x10

_exit: jmp _exit

global _start

_error:

mov al, 0x26
call _kputchar
jmp _exit

_kputchar:
pusha
mov ah, 0x0E
int 0x10
popa
ret

section .data

msg_error db "Error!"

dap:
packet_size db 10h
reserved db 00h
N_SEC dw 01h
buff_seg dw 00h
buff_off dw buff
X_SEC dd 0
dd 0

section .bss

buff resb 512


Мне обьяснили, что для реализации подобного в защищенном есть два способа:
1. Вернуться в реальный, считать, вернуться в защищенный. Чем это чревато? Что случиться с процссами в памяти?
2. Реализовать режим виртуального V86. Как это осуществляется?
14
23 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Ты меня окончательно и бесповоротно запутал. Ты приводишь код MBR,
Цитата: Robotex
для реализации подобного в защищенном есть два способа:
1. Вернуться в реальный, считать, вернуться в защищенный. Чем это чревато? Что случиться с процссами в памяти?
2. Реализовать режим виртуального V86. Как это осуществляется?


зачем его реализовывать в защищенном???!!
1. Из под Linux? Она не должна дать тебе перейти в реальный
2. Опять же, в какой среде реализовывать V86?

29K
23 октября 2008 года
Robotex
47 / / 02.10.2008
Да не из под линукса я это делаю. Сколько можно обьяснять.
Я пишу свою собственную ось. В ней нужно сделать чтение сектора. Вот я сделал код для реального режима, но ОСь моя должна работать в защищенном. Вот я и спрашиваю как сделать подобное в защищенном...
14
23 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Делай через порты в PIO режиме.
И еще читай это до полного просветления. И это. И это
29K
24 октября 2008 года
Robotex
47 / / 02.10.2008
Цитата: Phodopus
Делай через порты в PIO режиме.
И еще читай это до полного просветления. И это. И это



порты ж для флешки это очень сложно (((

14
24 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Выбирая такую тему на курсач надо было сразу задуматься о ее "кажущейся простоте"
5
24 октября 2008 года
hardcase
4.5K / / 09.08.2005
Топикстартер, ты отладчиком и виртуальной машиной пользуешься?
Просто интересно, ато VirtualPC 2007 + ядерный отладчик (Debugging tools for Windows) - неплохая связка для отладки ОС.
29K
24 октября 2008 года
Robotex
47 / / 02.10.2008
Цитата: Phodopus
Выбирая такую тему на курсач надо было сразу задуматься о ее "кажущейся простоте"



Не знаю как у вас, но у нас темы выбираются по номеру варианта, а не добровольно...

29K
24 октября 2008 года
Robotex
47 / / 02.10.2008
Цитата: hardcase
Топикстартер, ты отладчиком и виртуальной машиной пользуешься?
Просто интересно, ато VirtualPC 2007 + ядерный отладчик (Debugging tools for Windows) - неплохая связка для отладки ОС.



Писать ОС в Windows это извращение. Тем более этой самой Windows у меня нету. Пользуюсь VMware.

5
24 октября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Robotex
Писать ОС в Windows это извращение.


:D
Писать ОС самостоятельно - вот извращение.

А ту пару я как пример привел (имел с ними дело), мало ли чего под Линупсом есть (VMware + gdb ?) - без отладчика всяко хреново.

29K
24 октября 2008 года
Robotex
47 / / 02.10.2008
Ну мне сейчас не отладчик нужен (тем более я знаю способ прекрасно обходится без него, используя вывод определенного текста в определенных места). Мне интересно, как реализовать V86 режим, чтобы использовать вышеприведенный код в защищенном режиме
29K
11 ноября 2008 года
Robotex
47 / / 02.10.2008
Хм, а как прочитать/записать сектор с hdd через порты в защищенном режиме?
14
12 ноября 2008 года
Phodopus
3.3K / / 19.06.2008
Примерно так:
1. Отправить в порт ЖД сектор который хочешь прочитать
2. Прочитать из порта ЖД байты этого сектора

Я ж давал тебе ссылки для просветления? Ты чего-то не просветился!
29K
12 ноября 2008 года
Robotex
47 / / 02.10.2008
Я уже перелопатил кучу литературы и все равно нихрена не пойму...

Есть где нибудь нормальный исходник в котором реализованы чтение сектора с дискеты и запись сектора на дискету, который можно просто втавить в свою ОСь и пользоваться не задумываясь?
29K
15 декабря 2008 года
Robotex
47 / / 02.10.2008
Подскажите, пожалуйста, функцию, которая возвращает системное время...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог