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

Вниз

Ассемблер в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
15-1206636452
X9
2008-03-27 19:47
2008.05.11
WiFi на 4 км - реально ли?


2-1207916107
Alral
2008-04-11 16:15
2008.05.11
TWebBrowser- получение HTML


2-1207828862
dmdel
2008-04-10 16:01
2008.05.11
Управление службами в Windows XP


2-1208242787
Zloy_Funtik
2008-04-15 10:59
2008.05.11
Сохр. данных нескольких мемо полей относительно одного параметра


2-1207909029
savyhinst
2008-04-11 14:17
2008.05.11
Как вызвать диалог выбора папки???