Текущий архив: 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.5 MB
Время: 0.006 c