Помощь - Поиск - Пользователи - Календарь
Полная версия: Адресация,что-ли?
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
leone.incognito
Помогите пожалуста сообразить...Почитал про VESA 1.2 в статье С.А.Андрианова.Понравилось.
http://www.osp.ru/pcworld/1998/07/159374/

Но у меня есть проблеммммма.
Прямо с нулевой функции,которая возвращает инфу о наличии весы.
Как организовать эти 256 байт для буфера и записать его адрес в регистры es:di ?

Цитата

Функция 0 возвращает информацию о версии VESA и производителе видеоплаты. Перед ее вызовом необходимо выделить в нижней памяти буфер длиной 256 байт. В версии 2.0 функция позволяет получить некоторую дополнительную информацию, если в первые четыре байта выделенного буфера предварительно записать 4-байтную сигнатуру "VBE2". При этом размер буфера должен составлять 512 байт.

На входе:
AX = 4F00h;
ES:DI - указатель на буфер,
в который надо поместить информацию,
в формате сегмент:смещение
(обратите внимание: именно сегмент
реального режима, а не селектор защищенного).
На выходе:
AX - статус завершения.

Пишу в компиляторе паскаля,не 32.
volvo
Тебе обязательно это делать именно во встроенном ассемблере? Почему не хочешь перейти на TASM, например?

А вообще, насколько я помню, это делалось так:

function IsInstalled(var Buffer: TBuffer): Boolean; assembler;
asm
mov ax, 4F00h
les di, Buffer
int 10h
end;
где Buffer - это и есть область памяти размером в 256 байт...
левон.инкогнито
почему пишет ошибку при объявлении переменной типом Tbuffer?
volvo
Сам тип TBuffer описан выше по тексту программы? Можно - просто массивом из 256 (как минимум) байт, можно - как положено:
type
PWordArray = ^TWordArray;
TWordArray = array [0..256] of Word;

TBuffer = record
Sig: array [0..3] of Char;
UVersion: Byte;
LVersion: Byte;
Manufacturer: Pointer;
Flag: LongInt;
Modes: PWordArray;
Padding: array [19..256] of Byte;
end;
leone.incognito
Спасибо!))...но я всё равно до конца не понял.
Значит,код будет выглядеть примерно по-следуйщему,если просто с массивом?

Код

var
pointer:=^bufffffffffffer;{это как-бы указатель на адрес,так?}
bufffffffffffer:array[0..255]of byte;
begin
asm
  mov   ax, 4F00h
  les   di, pointer
  int   10h
end;
end.


Тут как-бы без записей(я их не понимаю как-то...),type и прочего...

Код

TWordArray = array [0..256] of Word;

Тут очепятка с word,или 512 байт выделяется для VBE2?
Ещё раз спасибо.
volvo
Цитата
Тут очепятка с word
Нет... Я ж не предлагаю тебе TWordArray использовать в качестве буффера... Указатель на TWordArray присутствует 6-ым полем в структуре. А размер самой структуры TBuffer равен 256 байт.

Цитата
Значит,код будет выглядеть примерно по-следуйщему,если просто с массивом?
Если с массивом - то вот так:
type TBuffer = array[0 .. 255] of byte;
function IsInstalled(var Buffer: TBuffer): Boolean; assembler;
asm
mov ax, 4F00h
les di, Buffer
int 10h
end;

var
buff: TBuffer;
begin
if IsInstalled(buff) then begin
{ Здесь работаешь дальше }
end
else writeln('Vesa не установлена...');
end.
, не придумывай сам себе проблемы. Пишешь на Паскале со вставками - так пиши именно на Паскале, а не пытайся ВСЕ подряд делать на вставках. Хочешь все делать на ассемблере - пиши на ассемблере.

Цитата
Тут как-бы без записей(я их не понимаю как-то...),type и прочего...
А не рановато тебе с Vesa-ой работать, если в записях не разобрался?
leone.incognito
Так!Я,кажется,уже что-то понимаю.Значит ,в этом коде
Код
type
  PWordArray = ^TWordArray;
  TWordArray = array [0..256] of Word;

  TBuffer = record
    Sig: array [0..3] of Char;
    UVersion: Byte;
    LVersion: Byte;
    Manufacturer: Pointer;
    Flag: LongInt;
    Modes: PWordArray;
    Padding: array [19..256] of Byte;
  end;

Modes- указатель?На адрес в буффере,где записываются режимы(так)?
Про то,что под буффер выделяется запись TBuffer(ведь так?)я понял.
То есть, как бы получается связка между TWordArray и TBuffer ,где TWordArray используется для объявления
указателя в TBuffer.Так ведь?

Дальше.
Код

function IsInstalled(var Buffer: TBuffer): Boolean; assembler;
asm
  mov   ax, 4F00h
  les   di, Buffer
  int   10h
end

Тут Buffer придаётся значение TBuffer,так?
Воть.
Про записи прочитал.Про type прочитал.Про 0 функцию перечитал,и наконец-то понял,зачем там modes как указатель.Гы.
Нужен ответ.Пожааааалуста.

Добавлено через 7 мин.
Ещё напишу!
Если писать ассемблерный код,а потом использовать его в Паскале,то это obj?В MASM'е?
leone.incognito
Спасибо.Понял всё.
andriano
Вообще-то в конце статьи (на 4 странице) приведены исходники.
В том числе функции GetVesaInfo, которая делает именно то, о чем ты спрашиваешь.
Только там используется не простой массив байтов, а структура, которая существенно облегчает доступ к возвращаемым параметрам.

Сама процедура
function GetVESAInfo(Buffer:pointer):boolean; {информация о VESA}
var
RetCode : word;
begin
asm
mov ax,$4f00
les di,Buffer
int $10
mov RetCode,ax
end;
GetVESAInfo := RetCode = $004F;
end;
А в структуру я бы добавил по минимуму еще один параметр
  TBuffer = record
Sig: array [0..3] of Char;
UVersion: Byte;
LVersion: Byte;
Manufacturer: Pointer;
Flag: LongInt;
Modes: PWordArray;
TotalMemory : word;
Padding: array [20..255] of Byte;
end;

Правда, на современных видеокартах возвращаемое значение будет далеко от реальности. Впрочем, DOS-приложениям это не нужно, им нужно максимум разместить экранный буфер, а хранение текстур в видеопамяти для них неактуально.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.