Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

pascal and assembler   Найти похожие ветки 

 
Igit ©   (2003-10-24 20:16) [0]

Приспичело мне функцию по определению видеорежма. В спровочнике нашел похожее Fh функция 16 прерывания. Написал такую функцию.
Function GetCurMode : Byte; assembler;
Asm
Mov AH, $0F
Int 16
Mov GetCurMode, AL
End;
А в предпоследней строчке ошибка. Неужели нельзя без registers?


 
default ©   (2003-10-24 20:21) [1]

вот из книги:
функция $F прерывания BIOS с номером $10
Определить текущий видеорежим
Вхожные параметры:
AH = 0F.
Возвращает:
AH = число столбцов
AL = текущий видеорежим
BH = видеостраница


 
default ©   (2003-10-24 20:23) [2]

видимо в BL должно быть число строк, в книге об этом тактично умолчали


 
Igit ©   (2003-10-24 20:23) [3]

Я знаю, мне нужно чтоб моя функция возвращала значение AL


 
Igit ©   (2003-10-24 20:25) [4]

Это я и пытался сделать в "Mov GetCurMode, AL", но оно не работает.


 
default ©   (2003-10-24 20:32) [5]

напиши на паскале функцию, потом посмотри её ассемблерный код и сделай по аналогии


 
NightAngel ©   (2003-10-24 20:49) [6]

> Igit ©
Вот здесь:
Mov GetCurMode, AL

дожно быть:
Mov @Result, AL

Удачи!


 
default ©   (2003-10-24 20:50) [7]

NightAngel © (24.10.03 20:49) [6]
здесь имеется ввиду Турбо Паскаль


 
default ©   (2003-10-24 20:51) [8]

NightAngel © (24.10.03 20:49) [6]
даже если брать Delphi это строка бессмысленна, так как при регистровом соглашении о вызове результат возвращается в регистр AL (в данном случае)


 
NightAngel ©   (2003-10-24 21:01) [9]

> default © (24.10.03 20:51) [8]

Читайте внимательно.

Igit © (24.10.03 20:16)
А в предпоследней строчке ошибка.
Я знаю, мне нужно чтоб моя функция возвращала значение AL
Это я и пытался сделать в "Mov GetCurMode, AL", но оно не работает.

Но вот так:
Mov GetCurMode, AL
работать не будет.

А мне без разницы, но если он не догадывается удалить эту строку, то это его проблемы.


 
NightAngel ©   (2003-10-24 21:05) [10]

Да, и в дополнение. В паскале, также, как и в Delphi - @Result имеет тоже самое значение.


 
Anatoly Podgoretsky ©   (2003-10-24 21:32) [11]

Igit © (24.10.03 20:23) [3]
Это единстаенное твое желание?
Тогда просто убери эту строчку

Mov GetCurMode, AL


 
default ©   (2003-10-24 22:21) [12]

NightAngel © (24.10.03 21:05) [10]
не знаю как у вас, а у нас вот это "Mov @Result, AL"
воспринимается как нечто неизвестное науке и технике)


 
default ©   (2003-10-24 22:52) [13]

Igit © (24.10.03 20:16)
оказывается и в Турбо Паскале результат функции может возвращаться через регистр, я раньше думал, что всё через стек
в данном случае результат как раз в AL возвращается
так что просто:

function GetVideoMode: Byte; assembler;
asm

MOV AH, 0FH
INT 10H

end;


 
NightAngel ©   (2003-10-25 00:48) [14]

default © (24.10.03 22:21) [12]

Специально посмотрел. Уберите директиву assembler вот здесь: function GetVideoMode: Byte; assembler;
и тогда компилятор создаст переменную @Result для результата функции. Компилятор не создаёт переменную @Result для результата функции и ссылка на эту переменную не допустима, исключением являются функции возвращающие значение строкового типа, для них разрешается использовать ссылку на @Result, но всё это справедливо только для функций объявленных с директивой assembler. Всё вышесказанное действительно для Турбо Паскаля по крайней мере начиная с версии 6.0 и старше. А так, действительно, Вам повезло, что результат после возврата из прерывания, как раз в AL возвращается. Вобщем то спор не о чём.


 
Anatoly Podgoretsky ©   (2003-10-25 00:51) [15]

Не приписывай директиве assembler, то чего ей не принадлежит, лучше взгляни в справку


 
NightAngel ©   (2003-10-25 01:21) [16]

Anatoly Podgoretsky © (25.10.03 00:51) [15]

А может лучше самому справку посмотреть?

Откомпилировал в Турбо Паскале 6:

program test;

uses
crt;

function Min(x,y:integer):integer;
begin
asm
mov ax, x
cmp ax, y
jl @
mov ax, y
@: mov @Result, ax
end;
end;

begin
clrscr;
writeln(min(5,10));
readln;
end.

Компилируется и запускается без проблем.

Когда переделал на это:

program test;

uses
crt;

function Min(x,y:integer):integer;assembler;
asm
mov ax, x
cmp ax, y
jl @
mov ax, y
@: mov @Result, ax
end;

begin
clrscr;
writeln(min(5,10));
readln;
end.

Не то, что не запускается, ещё при компиляции выдаёт ошибку: Invalid symbol reference и именно на @Result. Будем спорить?



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
4-42292
WondeRu
2003-09-09 15:30
2003.11.13
GINA


6-41801
Dolla
2003-09-17 13:02
2003.11.13
ошибка сокета


4-42314
Алексей Петухов
2003-09-05 12:10
2003.11.13
Прозрачные окошки


1-41244
RudeBoy
2003-11-01 00:24
2003.11.13
Как узнать что в моём приложении был нажа скрол мышки?


14-42137
Jek
2003-10-20 16:24
2003.11.13
Прикольное сообщение об ошибке