Форум: "Основная";
Текущий архив: 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