52 lines
1.9 KiB
Plaintext
52 lines
1.9 KiB
Plaintext
; Макрос выхода
|
|
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 ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
|
|
} |