; Макрос выхода macro edit_ex { popa ret } macro debug { ;----------- отладка pushad ; mov dword [ed_buffer.2],0 ; mov eax,edi mov eax,dword [ed_buffer.2] mov edi,ed_buffer.3 call .str ;рисование фона mov eax,13 mov ebx,178*65536+70 mov ecx,28*65536+10 xor edx,edx int 0x40 ;вывод значения на экран mov eax,4 mov ebx,180*65536+30 mov ecx,0x10DDBBCC mov edx,ed_buffer.3 mov esi,8 int 0x40 popad ;----------- отладка } macro debug_func { .str: mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax jb @f xor edx,edx ;очистить edx div ecx ;разделить - остаток в edx push edx ;положить в стек ;dec edi ;смещение необходимое для записи с конца строки call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx pop eax @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) ;sbb al,$69 ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) or al,0x30 ;данная команда короче чем две выше stosb ;записать элемент из регистра al в ячеку памяти es:edi ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться }