Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.032 c
1-41715
Тролль
2003-11-03 17:19
2003.11.13
Перенос пр-р и фуну-ий в другой файл


1-41302
Ломброзо
2003-10-31 11:04
2003.11.13
Можно ли убрать 3D border у DateTimePicker


1-41235
Sanl
2003-10-31 14:29
2003.11.13
Как удалить из строки типа PChar 2 символа


14-42017
R
2003-10-17 02:43
2003.11.13
StringGrid с цветом


1-41465
vil
2003-10-29 08:56
2003.11.13
отчет в FastReport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский