Помогите, как это #define VID_FROM_REG(val) ((val)==0x1f?0val)>=0x10?510-(val)*10:205-(val)*5) записать на asme. С правой частью понятно, а вот с этой (val)==0x1f?0val)>=0x10? нелады.
if( val == 0x1f ) { return 0; } else { if( val >= 0x10 ) { return (510 - val * 10); } else { return (205 - val * 5); } }
Вот чистый асм: mov eax, val cmp eax, 1Fh jne @@1 xor eax, eax ret @@1: cmp eax, 10h jb @@2 imul eax, eax, 10 neg eax add eax, 510 ret @@2: mov ecx, eax shl eax, 2 ; eax=eax shl 2 + ecx быстрее, чем imul eax, eax, 5 add eax, ecx neg eax add eax, 205 ret
Да, действительно, должно быть быстрее, спасибо за замечание! Забыл про lea, что сделаешь, старость не радость. Тогда и вместо imul eax, eax, 10 лучше написать так: lea eax, [eax*4+eax] add eax, eax.