Главная страница
    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.48 MB
Время: 0.036 c
7-42202
Alex134
2003-08-25 16:26
2003.11.13
опять про модем


14-42118
Andryk
2003-10-22 20:04
2003.11.13
Просто прикол :о)))


7-42172
AndreySoft
2003-08-29 21:53
2003.11.13
Как выключить компьютер по IP-адресу


1-41549
LORDIK
2003-10-25 20:36
2003.11.13
ReadLn


1-41476
AndreyA
2003-10-28 14:05
2003.11.13
Минимайз окон





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский