Ассемблер - экстремальная оптимизация


настоящие программисты


Приведенный ниже пример распечатывает число, содержащееся в регистре EAX в шестнадцатеричной, десятичной и восьмеричной форме, автоматически дописывая ведущие нули, растягивающие число до 4х разрядов. А теперь попробуйте осуществить тоже самое без использования библиотек и сравните размер полученного кода!

       mov eax, 666h        ; число, которое необходимо вывести на экран

      

       ; // переводим число в hex, dec и oct системы исчисления в ASCII-представлении

       sub esp, 60h         ; резервируем память под буфер куда пойдет результат

       mov ebx, esp         ; сохраняем указатель на буфер в регистре EBX

       push eax             ; \

       push eax             ;  + - передаем число для преобразования ф-ции sprintf

       push eax             ; /

       push offset s        ; передаем в стек указатель на строку спецификаторов

       push ebx             ; передаем указатель на буфер для получения результата

       call sprintf         ; прямой вызов функции sprintf

      



       ; // вывод преобразованных данных на экран через диалоговое окно

       xor eax,eax          ; eax := 0

       push eax             ; uType

       push eax             ; lpCaption

       push ebx             ; lpText

(наши преобразованные данные)

       push eax             ; hWnd

       call ds:[MessageBoxA]      ; косвенный

вызов API-функции MessageBox

      

       add esp, 60h + (5*4) ; выталкиваем аргументы из стека и уничтожаем буфер

       ...

       ...

       ...

s      db "%04X hex == %04d dec == %04o oct",0

; строка спецификаторов



Содержание раздела