Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.012 c
2-1208157323
arinyshka
2008-04-14 11:15
2008.05.11
Определить источник события


2-1207822060
Stepper
2008-04-10 14:07
2008.05.11
Как правельно складывать строки?


2-1208237932
John_Korsh
2008-04-15 09:38
2008.05.11
Доступ к портам под XP.


2-1208264686
assassin8899
2008-04-15 17:04
2008.05.11
Словарь


15-1206946550
Виталий____
2008-03-31 10:55
2008.05.11
Не работает отладка




   Наверх