UAC
833 постов
Карма: 27
#1 12 марта 2007 в 18:41
Кто-то кодил под эту штуку? <br />Всё что я знаю, что so called &quot;inline...&quot; напоминает <br />больше всего МАСМ. <br /><br />Я немного соприкасался с ТАСМ 5.0 и мне интересно <br />можно ли забить на все остальные компиляторы <br />и учится премудростям машинного кода непосредственно <br />под любимой M$ Visual Cpp 6.0 ? <br /><br />Пример: <br />
[size=7pt]#include &lt;stdio.h&gt;<br /><br />char format&#91;] = &quot;%s %s\n&quot;;<br />char hello&#91;] = &quot;Hello&quot;;<br />char world&#91;] = &quot;world&quot;;<br />void main( void )<br />{<br />&nbsp; __asm<br />&nbsp; {<br />&nbsp; &nbsp; &nbsp; mov&nbsp; eax, offset world<br />&nbsp; &nbsp; &nbsp; push eax<br />&nbsp; &nbsp; &nbsp; mov&nbsp; eax, offset hello<br />&nbsp; &nbsp; &nbsp; push eax<br />&nbsp; &nbsp; &nbsp; mov&nbsp; eax, offset format<br />&nbsp; &nbsp; &nbsp; push eax<br />&nbsp; &nbsp; &nbsp; call printf<br />&nbsp; &nbsp; &nbsp; pop&nbsp; ebx<br />&nbsp; &nbsp; &nbsp; pop&nbsp; ebx<br />&nbsp; &nbsp; &nbsp; pop&nbsp; ebx<br />&nbsp; }<br />}[/size]
ZASOR
828 постов
Карма: 21
#2 12 марта 2007 в 18:46
Ты камрад остановись на чем-нибудь одном&nbsp; ;D&nbsp; :D
This is what we do. And if you like it, good. If not, go fuck yourself.
UAC
833 постов
Карма: 27
#3 12 марта 2007 в 19:00
[quote author=ZASOR link=topic=119.msg2252#msg2252 date=1173725169]<br />Ты камрад остановись на чем-нибудь одном&nbsp; ;D&nbsp; :D<br />[/quote]<br />А я ещё толком и не начинал. Приходишь так с работы: <br />&quot;Сейчас похаваю и сяду... учить... Х.У.Я.С.М.&quot; <br /> :D
ZASOR
828 постов
Карма: 21
#4 12 марта 2007 в 19:15
;D ;D ;D<br />[hr]<br />
This is what we do. And if you like it, good. If not, go fuck yourself.
UAC
833 постов
Карма: 27
#5 12 марта 2007 в 19:16
[quote author=ZASOR link=topic=119.msg2254#msg2254 date=1173726949]<br /> ;D ;D ;D<br />[hr]<br />http://static.flickr.com/79/261457181_83009a8652_o.jpg<br />[/quote]<br />Оффтоп, но эту серию я видел - зачёт!&nbsp; ;)
KRIGSSVIN
930 постов
Карма: 53
#6 12 марта 2007 в 19:19
что это за бред? Зачем столько поппать ebx? Мы же eax пушим?&nbsp; &gt;:(<br /><br />
#include &lt;stdio.h&gt;<br /><br />char format&#91;] = &quot;%s %s\n&quot;;<br />char hello&#91;] = &quot;Hello&quot;;<br />char world&#91;] = &quot;world&quot;;<br />void main( void )<br />{<br />&nbsp; __asm<br />&nbsp; {<br />&nbsp; &nbsp; &nbsp; mov&nbsp; eax, offset world<br />&nbsp; &nbsp; &nbsp; push eax<br />&nbsp; &nbsp; &nbsp; mov&nbsp; eax, offset hello<br />&nbsp; &nbsp; &nbsp; push eax<br />&nbsp; &nbsp; &nbsp; mov&nbsp; eax, offset format<br />&nbsp; &nbsp; &nbsp; push eax<br />&nbsp; &nbsp; &nbsp; call printf<br />&nbsp; &nbsp; &nbsp; pop&nbsp; ebx<br />&nbsp; &nbsp; &nbsp; pop&nbsp; ebx<br />&nbsp; &nbsp; &nbsp; pop&nbsp; ebx<br />&nbsp; }<br />}
UAC
833 постов
Карма: 27
#7 12 марта 2007 в 19:23
[quote author=KRIGSSVIN link=topic=119.msg2256#msg2256 date=1173727182]<br />что это за бред? Зачем столько поппать ebx? Мы же eax пушим?&nbsp; &gt;:(<br /><br />[/quote]<br />Хм, верно. Компилится без предупреждений и ошибок... <br />Проморгал. <br /><br />Надо так(?) <br />
[size=7pt]#include &lt;stdio.h&gt;<br /><br />char format&#91;] = &quot;%s %s\n&quot;;<br />char hello&#91;] = &quot;Hello&quot;;<br />char world&#91;] = &quot;world&quot;;<br />void main( void )<br />{<br />&nbsp; __asm<br />&nbsp; {<br />&nbsp; &nbsp; &nbsp; mov&nbsp; eax, offset world<br />&nbsp; &nbsp; &nbsp; push eax<br />&nbsp; &nbsp; &nbsp; mov&nbsp; eax, offset hello<br />&nbsp; &nbsp; &nbsp; push eax<br />&nbsp; &nbsp; &nbsp; mov&nbsp; eax, offset format<br />&nbsp; &nbsp; &nbsp; push eax<br />&nbsp; &nbsp; &nbsp; call printf<br />&nbsp; &nbsp; &nbsp; pop&nbsp; eax<br />&nbsp; &nbsp; &nbsp; pop&nbsp; eax<br />&nbsp; &nbsp; &nbsp; pop&nbsp; eax<br />&nbsp; }<br />}[/size]
KRIGSSVIN
930 постов
Карма: 53
#8 12 марта 2007 в 22:31
Ага теперь правильно!<br />А _asm всегда без предупреждений глупых... на то он и асм. Там только корявый синтаксис - ошибка.&nbsp; :D О других ошибках ты узнаешь по работе программы&nbsp; ;D
UAC
833 постов
Карма: 27
#9 13 марта 2007 в 04:50
KRIGSSVIN <br />Можешь мне подбросить какой-нибудь кусок кода на инлайн-АСМе <br />из своей практики? Чуть более серьёзный, потому что этот беспонтовый - <br />вызывает ту же printf, вот блин, поражатели воображения <br /> :-X&nbsp; ;)
willow
570 постов
Карма: 56
#10 13 марта 2007 в 06:08
UAC: Да пожалуйста! Вот тебе код из дума 3, переведённый мною на встроенный АСМ.<br />Вычисляет угол обзора камеры, основываясь на пропорциях экрана<br />r_aspectRatio = 0&nbsp; -- 4*3<br />r_aspectRatio = 1&nbsp; -- 16*9<br />r_aspectRatio = 2&nbsp; -- 16*10<br />и предлагаемом первичном угле по горизонтали X. Возвращает угол по Y и, при необходимомости, правит X.<br /><br />void idGameLocal::CalcFov( float &amp;fov_x, float &amp;fov_y ) const<br />{<br /> unsigned int i360 = 360,<br /> aspect = r_aspectRatio.GetInteger();<br /> float f16_12 = 4.0f/3.0f,<br /> f10_16 = 5.0f/8.0f,<br /> f9_16&nbsp; = 9.0f/16.0f;<br /> // first, calculate the vertical fov based on a 640x480 view<br /> __asm<br /> {<br /> mov EAX,fov_x<br />// x = 640.0f / tan( base_fov / 360.0f * idMath::PI );<br /> fldpi<br /> fmul float ptr [EAX]<br /> fidiv i360<br /> fptan<br /> ffree st(0)<br /> fincstp<br /> fld f16_12<br />// y = atan2( 480.0f, x );<br /> fpatan<br /> cmp aspect,2<br /> je aspect_2<br /> cmp aspect,1<br /> jne fov_y_fin<br /> push f9_16<br /> jmp short aspect_new<br />aspect_2: push f10_16<br />aspect_new:<br />// y = ratio_y / tan( fov_y / 360.0f * idMath::PI );<br />// fov_x = atan2( ratio_x, y ) * 360.0f / idMath::PI;<br /> fld st(0)<br /> fptan<br /> ffree st(0)<br /> fincstp<br /> fld float ptr [ESP]<br /> add ESP,4<br /> fpatan<br /> fimul i360<br /> fldpi<br /> fdiv<br /> fstp float ptr [EAX]<br />// fov_y = y * 360.0f / idMath::PI;<br />fov_y_fin: fimul i360<br /> fldpi<br /> fdiv<br /> mov EAX,fov_y<br /> fstp float ptr [EAX]<br /> }<br />}<br />