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

Вниз

Ассемблер в Turbo Pascal 7.0   Найти похожие ветки 

 
Тыщ   (2008-03-26 15:04) [0]

Хочу разобраться с генерацией кода во встроенном ассемблере в Turbo Pascal 7.0.

Я написал простую функцию:

function GetCMOSValue(RegNum:byte):byte; assembler;
asm
 mov al,RegNum { без этой строки не работает, как предполагалось }
 out 70h,al
 in  al,71h
end;


Смотрю в полученный код, а там:


 push  bp
 mov   bp,sp
 xor   ax,ax
 call  0Bh:366h  { по адресу еще куча кода }
 mov   al,[bp+4]
 out   70h,al
 in    al,71h
 leave
 retn  2


Почему генерируется так много лишнего?
Как заставить TP передавать параметры через регистры?


 
Сергей М. ©   (2008-03-26 15:06) [1]

Тебе делать что ли нечего, кроме как копаться на свалке истории ?)


 
Тыщ   (2008-03-26 15:28) [2]

Сергей, вас это не должно интересовать .)


 
Сергей М. ©   (2008-03-26 16:05) [3]


> вас это не должно интересовать


Ну почему же ?
Мне тоже стало интересно, что скрывается за


> call  0Bh:366h  { по адресу еще куча кода }


Я, конечно, могу сделать кой-какие предположения, но это только предположения)


 
Григорьев Антон ©   (2008-03-26 16:09) [4]

Есть какие-то смутные воспоминания, что была в TP опция компилятора - контролировать переполнение стека. И этот код - проверка того, что стек не переполнен. Попробуйте найти эту опцию и отключить её и посмотрите, не изменился ли код.


 
Сергей М. ©   (2008-03-26 16:15) [5]


> Тыщ   (26.03.08 15:04)


Ну а по поводу


>  push  bp
>  mov   bp,sp


это, видимо, эквивалент инструкции enter N, генерирующей стековый фрейм, что тоже наверняка отключается в опциях компилятора.

p.s. Я ТР никогда не пользовал, благополучно миновав эту "эпоху")


 
Тыщ   (2008-03-26 16:24) [6]

Григорьев Антон ©   (26.03.08 16:09) [4]

Ах да, точно! Спасибо. Этот вызов действительно был проверкой стека.
Отключил проверку стека ({$S-}), код стал таким:

 push  bp
 mov   bp,sp
 mov   al,[bp+4]
 out   70h,al
 in    al,71h
 leave
 retn  2


Хотелось бы заставить TP передавать параметры через регистры, чтобы функция выглядела так:

 out   70h,al
 in    al,71h


В принципе, такой код тоже работает, но то, что он вызывается так:

 ...
 mov  al,[150h]
 push ax
 call 50h { GetCMOSValue }


Вызывает сомнения.


 
БарЛог ©   (2008-03-26 16:25) [7]

Есть еще такие люди на свете!


 
Тыщ   (2008-03-26 16:26) [8]

Сергей М. ©   (26.03.08 16:15) [5]

Отключение стекового фрейма я не нашел, видимо, TP этого не позволяет.


 
Сергей М. ©   (2008-03-26 16:37) [9]


> Тыщ


В ТР вроде бы есть ф-ция Port() - она чем не угодила ?


 
Тыщ   (2008-03-26 16:43) [10]

Сергей М. ©   (26.03.08 16:37) [9]

Как-то не очень :)

function GetCMOSValue(RegNum:byte):byte;
begin
 Port[$70]:=RegNum;
 GetCMOSValue:=Port[$71];
end;


Результат:

 enter 2,0
 mov   al,[bp+04h]
 out   70h,al
 in    al,71h
 mov   [bp-1],al
 mov   al,[bp-1]
 leave
 retn  2


 
Семеныч   (2008-03-26 16:45) [11]

Описатель register в заголовке?


 
Сергей М. ©   (2008-03-26 16:48) [12]


> Тыщ   (26.03.08 16:43) [10]
> Как-то не очень


ты все же обозначь, что тебя смущает в действиях компилятора в части стек.фреймов ?
Как это отразится на производительности твоего приложения ?
Что вообще твое приложение делает такого неординарного, что потребовалась оная ловля блох ?


 
Тыщ   (2008-03-26 16:57) [13]

Семеныч   (26.03.08 16:45) [11]

Поискал в доках, в помощи - нет такого. Попробовал вставить - компилятор ругается.
Может, вы путаете с Delphi?

Сергей М. ©   (26.03.08 16:48) [12]

Меня смущает вот это:

 mov   [bp-1],al
 mov   al,[bp-1]


А также невозможность передачи параметров через регистры (я пока не нашел).

Производительность тут ни при чем. Я изучаю компилятор.


 
Сергей М. ©   (2008-03-26 16:59) [14]


> Тыщ   (26.03.08 16:57) [13]


> Я изучаю компилятор


Вот я и поинтересовался, в чем кайф изучать компилятор времен "когда деревья были большими", если гораздо интересней и полезней копаться в современном компиляторе)


 
Тыщ   (2008-03-26 17:01) [15]

Сергей М. ©   (26.03.08 16:59) [14]

А я и в современном копаюсь :)


 
Германн ©   (2008-03-26 17:07) [16]

Синдром Riply, однако :-)


 
Сергей М. ©   (2008-03-26 17:08) [17]


> я и в современном копаюсь


В современном обмен параметрами/результатами через РОН четок, прозрачен и подконтролен.


 
Тыщ   (2008-03-26 17:24) [18]

Для получения оптимального результата пришлось извратиться вот так:

function GetCMOSValue(RegNum:byte):byte;
inline($E6/$70/  { out 70h,al }
      $E4/$71); { in  al,71h }


Жестокий Turbo Pascal :)


 
Сергей М. ©   (2008-03-26 17:28) [19]


> пришлось извратиться вот так


Вот я и говорю [1]

)


 
Тыщ   (2008-03-26 17:43) [20]

Ха, а еще можно использовать Turbo Assembler.

cmosget1.asm:

segment CODE

public GetCMOSValue

GetCMOSValue proc
 out 70h,al
 in  al,71h
 ret
GetCMOSValue endp

ends
end


cmosget.pas:

function GetCMOSValue(RegNum:byte):byte; external; {$L cmosget1.obj}

Задача решена.


 
Сергей М. ©   (2008-03-26 18:43) [21]

Вот ведь есть на свете чебуреки, прямо по ходу дела меняющие свою рецептуру)


> Тыщ   (26.03.08 17:43) [20]


Дружок ситный, ты ТР-компайлер мучаешь ? Или какой-то там линкер ?

Ты уж, дружок, разберись там как-нить с компиляцией и сборкой)


 
Семеныч   (2008-03-26 18:58) [22]

> Тыщ   (26.03.08 16:57) [13]

Нет, не путаю. Правда, и помню смутно, забыл уже. Но что-то в TP на тему register было (по крайней мере, в TP5.5). Попробую посмотреть вечером, дома (только найти бы TP в старых архивах...).


 
Тыщ   (2008-03-26 19:28) [23]

Сергей М. ©   (26.03.08 18:43) [21]

Что не так? tpc.exe - это и линкер, и компилятор.

Семеныч   (26.03.08 18:58) [22]

Перерыл гору исходников, нет register, нашел только var reg:registers;.


 
Сергей М. ©   (2008-03-26 19:33) [24]


> Тыщ   (26.03.08 19:28) [23]


Ты ж в компиляторе копаешься, а не в линкере)


 
Тыщ   (2008-03-26 19:50) [25]

Сергей М. ©   (26.03.08 19:33) [24]

Ну все, линкер - запретная тема. Я копаюсь в tpc.exe :)



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

Форум: "Прочее";
Текущий архив: 2008.05.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.007 c
15-1206640738
@!!ex
2008-03-27 20:58
2008.05.11
НЕзависимая экспертиза.


15-1206403811
Hero
2008-03-25 03:10
2008.05.11
Пытаюсь сделать sudoku


3-1196934351
MZ
2007-12-06 12:45
2008.05.11
Узнать права роли на объект


6-1185968146
Тестер2
2007-08-01 15:35
2008.05.11
Sockets, MaxDataLen=8192


15-1206469141
@!!ex
2008-03-25 21:19
2008.05.11
оцените пожалуйста код





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