diff --git a/programs/develop/cmd/trunk/examples/AUTOEXEC.CMD b/programs/develop/cmd/trunk/examples/AUTOEXEC.CMD new file mode 100644 index 0000000000..b00dc39ce4 --- /dev/null +++ b/programs/develop/cmd/trunk/examples/AUTOEXEC.CMD @@ -0,0 +1,5 @@ +ver +echo Type 'help' for help. Type '/example' for additional information (RUS) +echo +ends + diff --git a/programs/develop/cmd/trunk/examples/EXAMPLE.CMD b/programs/develop/cmd/trunk/examples/EXAMPLE.CMD new file mode 100644 index 0000000000..4ce0d85bbe --- /dev/null +++ b/programs/develop/cmd/trunk/examples/EXAMPLE.CMD @@ -0,0 +1,35 @@ +cls +echo +echo Это простейший пример исполняемого скрипта для интерпретатора командной +echo строки CMD версии 0.24 +echo Используйте команды echo и pause для вывода текста и возможности +echo взаимодействия с пользователем. +echo В связи с недостаточной доработкой интерпретатора и механизма исполнения +echo скриптов желательно создавать скрипты только в TINYPAD'e и не изменять уже +echo сохранённый на рамдиск файл, приэтом не оставлять после команд ненужных +echo символов (например, пробелы). +echo +echo Пример выполнения простейшей практической задачи с помощью исполняемых +echo скриптов: +echo +echo Нажмите любую клавишу для того, чтобы создать запасную копию файла CMD.ASM +pause +cp cmd.asm+cmd.bak +echo +echo Теперь нажмите любую клавишу для того, чтобы вывести имя только что +echo созданного файла на экран и удостовериться в его присутствии на /RD/1 +pause +ls cmd.bak +echo +echo Теперь нажмите любую клавишу для того, чтобы удалить только что созданный +echo файл CMD.BAK с рамдиска. +pause +del cmd.bak +echo +echo При вызове команды PAUSE вы можете нажать клавишу ESCAPE, чтобы прервать +echo работу скрипта. Выполнение внешних команд в данной версии уже реализовано. +echo Использование символа '/' в скриптах не реализовано. В данной версии +echo командные скрипты рекомендуется завершать командой ends. +echo Ждите обновлений. +echo +ends \ No newline at end of file diff --git a/programs/develop/cmd/trunk/examples/HELLO.ASM b/programs/develop/cmd/trunk/examples/HELLO.ASM new file mode 100644 index 0000000000..8799c6ad80 --- /dev/null +++ b/programs/develop/cmd/trunk/examples/HELLO.ASM @@ -0,0 +1,70 @@ +; Hello, World! - Programm example for CMD shell +; Compile with FASM for Menuet +; +; You must run this program from CMD shell only +; + +use32 + + org 0x0 + + db 'MENUET01' + dd 0x01 + dd START + dd I_END + dd 0x100000 + dd 0x7fff0 + dd 0x0 + dd 0x0 + +include "CMDIPC.INC" ; Подключить файл CMDIPC.INC + +START: + call initipc ; инициализировать для работы с CMD + + mov eax,26 ; Длина строки + mov ebx,hello_text ; Указатель на строку + call print ; Вывести строку + +again: + call getkey ; Ожидать нажатия клавиши и считать ее в key + + cmp byte [key],'Y' ; Тут программа проверяет, нажата ли нужн. клавиша + je goodday + cmp byte [key],'y' + je goodday + cmp byte [key],'N' + je goodmorning + cmp byte [key],'n' + je goodmorning + + jmp again ; Если нужн. клавиша не нажата, то считать клавишу + ; заново +goodday: ; Вывести приветствие Good Day, World! + call eol ; Пропустить строку + + mov eax,16 + mov ebx,text4 + call print + + call eol ; Пропустить строку + + jmp endipc ; Завершить программу + +goodmorning: ; Вывести приветствие Good Morning, World! + call eol + + mov eax,20 + mov ebx,text5 + call print + + call eol + + jmp endipc ; Заверщить программу + +hello_text db 'Is it after 12 noon? [Y\N]?' + +text4 db 'Good day, World!' +text5 db 'Good morning, World!' + +I_END: diff --git a/programs/develop/cmd/trunk/examples/PARAM.ASM b/programs/develop/cmd/trunk/examples/PARAM.ASM new file mode 100644 index 0000000000..9e716f6fed --- /dev/null +++ b/programs/develop/cmd/trunk/examples/PARAM.ASM @@ -0,0 +1,55 @@ +use32 + + org 0x0 + + db 'MENUET01' + dd 0x01 + dd START + dd I_END + dd 0x100000 + dd 0x7fff0 + dd I_PARAM ; указатель на параметры + +include "CMDIPC.INC" ; Подключить файл CMDIPC.INC + +START: + call initipc ; инициализировать для работы с CMD + + mov eax,47 ; вывести сообщение + mov ebx,mess + call print + + call eol ; пропустить строку + call eol + + cmp [I_PARAM],byte 0 ; проверить, есть ли параметры + jz noparam + + mov eax,43 + mov ebx,mess1 + call print + + call eol + + mov eax,30 ; вывести параметры + mov ebx,I_PARAM + call print + + jmp end1 ; переход в конец программы + +noparam: + mov eax,40 ; вывести сообщение о том, что нет параметров + mov ebx,mess2 + call print + +end1: + jmp endipc ; завершить программу + +mess db 'PARAM.ASM - Test params in IPC programs for CMD' + +mess1 db 'This program was started with this params: ' +mess2 db 'This program was started without params!' + +I_PARAM db 0 + +I_END: \ No newline at end of file diff --git a/programs/media/paint/trunk/PAINT.ASM b/programs/media/paint/trunk/PAINT.ASM new file mode 100644 index 0000000000..c088f7f0bb --- /dev/null +++ b/programs/media/paint/trunk/PAINT.ASM @@ -0,0 +1,365 @@ +;********************************* +;* * +;* PAINT 0.02 для MenuetOS * +;* * +;* Компилировать FASM'ом * +;* * +;********************************* + +;****************************************************************************** +; Эту программу не нужно серьезно рассматривать - это всего лишь пример, +; в котором показано, как работать с некоторыми системными функциями МеОС, +; но никак не нормальный графический редактор. Код программы ОЧЕНЬ простой, +; и она предназначена для тех, кто только начинает изучать ассемблер, +; поэтому я стремился сделать его как можно более понятным. +; Тем не менее, код довольно неплохо оптимизирован, хотя это немного +; может затруднить его понимание. Я постарался тщательно прокомментировать +; сложные места. Кстати, идея программы принадлежит не мне, а Sniper'у, для +; которого вобщем-то все и писалось. +; Удачи в изучении асма! +; Иван Поддубный, ivan-yar@bk.ru +;****************************************************************************** + +; Подключаем необходимые макросы +include 'macros.inc' + +;****************************************************************************** + +; НАЧАЛО ПРОГРАММЫ +meos_app_start +; ОБЛАСТЬ КОДА +code + mov eax,40 ; сообщим системе, какие события будем обрабатывать + mov ebx,0100101b ; маска событий - перерисовка (1) + кнопка (3) + мышь (6 + int 0x40 ; эта команда вызывает системную функцию + + mov [workarea.cx],10 ; координаты рабочей (клиентской) области + mov [workarea.cy],45 ; для рисования + +red: + call draw_window ; вызываем процедуру отрисовки окна + +still: ; ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ - ЦИКЛ ОБРАБОТКИ СООБЩЕНИЙ + + mov eax,10 ; функция 10 - ждать события; программа останавливается на + int 0x40 ; следующая команда не будет выполнена до тех пор, пока + ; не произойдёт событие + + ; теперь регистр eax содержит номер события + ; поочередно сравним его со всеми возможными значениями, чтобы вызвать + ; нужный обработчик + + cmp eax,1 ; перерисовать окно ? + je red ; если регистр eax равен единице, то переходим на метку red + cmp eax,3 ; нажата кнопка ? + je button + cmp eax,6 ; мышь? + je mouse + + jmp still ; если произошло событие, которое мы не обрабатываем, + ; просто возвращаемся к началу цикла, хотя такого быть + ; не должно! Т.е. если эту команду отсюда убрать, то + ; ничего страшного не случится. + +;****************************************************************************** + + button: ; обработчик нажатия кнопки в окне программы + mov eax,17 ; функция N17 - получить идентификатор нажатой кнопки + int 0x40 + + ; теперь в регистре ah содержится идентификатор. + + shr eax,8 ; ah -> al (сдвиг на 8 бит вправо) + + dec al ; идентификатор_кнопки--; + jnz .noclose ; если результат предыдущей команды равен нулю, закрываемся + ; иначе - идём на метку noclose + + or eax,-1 ; выход из программы + int 0x40 + + .noclose: + ; если мы сюда попали, значит идентификатор кнопки не был равен нулю... + ; теперь у нас в eax содержится (номер цветной кнопки - 1), + ; т.е или 1, или 2, ... ,или 5 + + ; уменьшим на 1: + dec eax + + ; вот эта вот команда извлекает в eax двойное слово по адресу colors+eax*4 + ; где colors - смещение метки colors, после которой идет последовательность + ; цветов, eax*4 - номер цвета, умноженный на 4, т.к. на один цвет нужно + ; четыре байта. + mov eax,[colors+eax*4] + + ; теперь мы установим цвет, содержащийся в регистре eax как основной: + mov [active_color],eax + + ; ну вот, собственно, и всё, что от нас требовалось ;) + ; вернёмся к началу цикла обработки событий + jmp still + +;****************************************************************************** + + mouse: ; обработчик мыши + mov eax,37 ; сначала получим текущие координаты мыши + mov ebx,1 + int 0x40 + + mov ebx,eax ; преобразуем их + shr eax,16 ; eax=x; + and ebx,0xffff ; ebx=y; + + cmp ebx,22 + jb save_canvas + + sub eax,[workarea.cx] ; x-=[workarea.cx] + cmp eax,0 ; если мышь левее клиентской области, + jle .not_pressed ; ничего не рисуем + cmp eax,[workarea.sx] ; если мышь правее... + jae .not_pressed + + sub ebx,[workarea.cy] + cmp ebx,0 ; ...выше... + jle .not_pressed + cmp ebx,[workarea.sy] ; ...ниже... + jae .not_pressed + + ; какие кнопки нажаты? + mov eax,37 + mov ebx,2 + int 0x40 + + ; если левая кнопка (т.е. eax = 1), те пойдём дальше + cmp eax,1 + je .leftbtn + + .not_pressed: + ; Левая кнопка не нажата, запомним текущие координаты и будем ждать события + mov [mouse_pressed],0 ; мышь не нажата + mov eax,37 ; получим координаты + mov ebx,1 + int 0x40 + mov ebx,eax + shr eax,16 + and ebx,0xffff + mov [old_x],eax ; запомним их + mov [old_y],ebx + jmp still + + .leftbtn: + ; Левая кнопка нажата, надо это записать! + mov [mouse_pressed],1 + + ; Получим координаты курсора мыши (относительно окна) + mov eax,37 ; функция 37 - получить состояние мыши + mov ebx,1 ; подфункция 1 + int 0x40 + + ; Переделаем их так, чтобы они были в разных регистрах, т.е. eax и ebx + mov ebx,eax + shr eax,16 + and ebx,0xffff + + ; Подготовим параметры для функции рисования линии + mov ecx,[old_x] ; для начала загрузим старые координаты + mov edx,[old_y] + mov [old_x],eax ; теперь сохраним текущие в старые + mov [old_y],ebx + shl ecx,16 ; в верхнее слово начальные (текущие) координаты + shl edx,16 + add eax,ecx ; а в нижнее слово конечные, т.е. старые + add ebx,edx + + mov ecx,ebx ; поменяем регистры так, как эту нужно 38 функции + mov ebx,eax + mov eax,38 ; номер функции в eax + mov edx,[active_color] ; в edx цвет + int 0x40 + +;  - попробуйте поставить другие значения (00090001) + mov edi,0x00010001 ; чтобы линия не была слишком тонкой, + add ebx,edi ; нарисуем рядом еще 3! + int 0x40 + add ecx,edi + int 0x40 + sub ebx,edi + int 0x40 + + sub ebx,edi ; ну а чтобы смотрелось совсем круто, + int 0x40 ; дорисуем еще 5! + sub ecx,edi + int 0x40 + sub ecx,edi + int 0x40 + add ebx,edi + int 0x40 + add ebx,edi + int 0x40 + + jmp still + +;****************************************************************************** + +save_canvas: + mov eax,[process.x_size] + add eax,[workarea.cx] + mov ebx,[process.y_size] + add ebx,[workarea.cy] + + jmp still + +;****************************************************************************** + +; ********************************************* +; ******* ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ******* +; ********************************************* + +draw_window: + + mov eax,48 ; ПОДГРУЖАЕМ СИСТЕМНЫЕ ЦВЕТА + mov ebx,3 + mov ecx,sc + mov edx,sizeof.system_colors + int 0x40 + + mov eax,12 ; функция 12: сообщить ОС об отрисовке окна + mov ebx,1 ; 1, начинаем рисовать + int 0x40 + + ; СОЗДАЁМ ОКНО + mov eax,0 ; функция 0 : определить и отрисовать окно + mov ebx,100*65536+400 ; [x старт] *65536 + [x размер] + mov ecx,100*65536+300 ; [y старт] *65536 + [y размер] + mov edx,[sc.work] ; цвет рабочей области RRGGBB,8->color gl + or edx,0x02000000 + mov esi,[sc.grab] ; цвет полосы заголовка RRGGBB,8->color gl + or esi,0x80000000 + mov edi,[sc.frame] ; цвет рамки RRGGBB + int 0x40 + + mov eax,9 ; получим информацию о себе + mov ebx,process + mov ecx,-1 + int 0x40 + + mov eax,[process.x_size] ; настроим размер рабочей области + add eax,-20 ; (х размер окна - 20) + mov [workarea.sx],eax ; + mov eax,[process.y_size] ; + add eax,-60 ; (у размер - 60) + mov [workarea.sy],eax ; + + ; ЗАГОЛОВОК ОКНА + mov eax,4 ; функция 4 : написать в окне текст + mov ebx,8*65536+8 ; [x] *65536 + [y] + mov ecx,[sc.grab_text] ; цвет + or ecx,0x10000000 ; шрифт + mov edx,header ; адрес строки + mov esi,header_len ; и её длина + int 0x40 + + ; КНОПКА ЗАКРЫТИЯ ОКНА + mov eax,8 ; функция 8 : определить и нарисовать кнопку +; mov ebx,(300-19)*65536+12 ; [x старт] *65536 + [x размер] + mov ebx,[process.x_size] + add ebx,-19 + shl ebx,16 + add ebx,12 + mov ecx,5*65536+12 ; [y старт] *65536 + [y размер] + mov edx,1 ; идентификатор кнопки + mov esi,[sc.grab_button] ; цвет кнопки RRGGBB + int 0x40 + + cmp [process.y_size],80 + jb .finish + + ; создаём кнопки выбора цвета: + mov ebx,10*65536+10 ; начальная x координата и размер + mov ecx,27*65536+10 ; начальная y координата & size + .new_button: + inc edx ; идентификатор++; + mov esi,[btn_colors-8+edx*4] ; цвет кнопки + int 0x40 ; ставим кнопку + add ebx,12*65536 ; следующая кнопка правее на 12 + cmp edx,9 ; сравниваем edx (идентификатор) с 9 + jbe .new_button ; если меньше или равно -> ещё одну кпоку + + mov eax,13 ; чистим "холст" - клиентскую область + mov ebx,[workarea.cx] + mov ecx,[workarea.cy] + shl ebx,16 + shl ecx,16 + add ebx,[workarea.sx] + add ecx,[workarea.sy] + mov edx,0xffffff + int 0x40 + + .finish: + mov eax,12 ; сообщаем системе о завершении отрисовки окна + mov ebx,2 + int 0x40 + + ret + +;****************************************************************************** +; начало области инициализированных данных +; если кто ещё не знает, что значит "инициализированные", то поясняю: +; это те данные, которым присвоено начальное значение +data + +header: ; строка заголовка + db 'PAINT v0.2 for MenuetOS' +header_len = $ - header ; и её длина + + mouse_pressed db 0 ; показывает, нажата ли была мышь в предыдущий момент + +; цвета кнопок +btn_colors: + dd 0xdddddd ; white + dd 0x444444 ; black + dd 0x00dd00 ; green + dd 0x0000dd ; blue + dd 0xdd0000 ; red + dd 0xdd00dd ; magenta + dd 0xdddd00 ; yellow + dd 0x00dddd ; cyan + dd 0x559955 ; warm green + +; цвета кисти (в том же порядке, что и цвета кнопок) +colors: + dd 0xffffff ; белый + dd 0x000000 ; черный + dd 0x00ff00 ; зеленый + dd 0x0000ff ; синий + dd 0xff0000 ; красный + dd 0xff00ff ; пурпурный + dd 0xffff00 ; желтый + dd 0x00ffff ; голубой + dd 0x77bb77 ; теплый зеленый + +;****************************************************************************** +; а вот тут начинается область НЕинициализированных данных, т.е. +; здесь данным значения не присвоены. В отличие от иниц., не увеличивают размер +; файла + +udata + + active_color dd ? ; активный цвет + + old_x dd ? ; старые координаты мыши + old_y dd ? + + workarea: ; координаты и размеры клиентской области + .cx dd ? ; c - коодинаты + .cy dd ? + .sx dd ? ; s - размеры + .sy dd ? + + sc system_colors ; системные цвета + process process_information ; информация о процессе + + restflag dd ? + canvas rb 800*600*3 + +meos_app_end diff --git a/programs/system/mm/trunk/MM.asm b/programs/system/mm/trunk/MM.asm new file mode 100644 index 0000000000..ca35763e26 --- /dev/null +++ b/programs/system/mm/trunk/MM.asm @@ -0,0 +1,276 @@ +; Programa Mostra memoria +; Projeto: Clovis Bombardelli e Felipe Gustavo Bombardelli +; Usar Fasm Assembler +; Dez/2007 + + +; Infos: +; keys: w - add 0x200 to current memory address +; s - sub 0x200 +; e - add 0x10 +; d - sub 0x10 +; + +use32 + + org 0x0 + +STACK_SIZE=1024 + + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd I_END ; size of image + dd I_END+STACK_SIZE ; memory for app + dd I_END+STACK_SIZE ; esp + dd 0x0 , 0x0 ; I_Param , I_Icon + + + + + +START: + + +main: + + call monta_quadro + +.a: mov eax, 11 ; espera por evento + int 0x40 ; 0= -> redraw + or al,al + jz .h + cmp al, 2 ; 1= -> REDRAW + jb main ; 2= -> tecla pressionada + jz .c ; 3= -> botуo pressionado + +; botуo + mov eax,17 ; + int 0x40 ; OBSERVA╟╒ES + cmp ah,1 ; se o botуo apertado for fechar, minimizar, maximizar...todos devem ser do sistema + jnz .b ; mover...etc + or eax,-1 ; saida do aplicativo **************************deve ser do sistema + int 0x40 ; nunca do aplicativo + +.b: jmp .a ; loop para novo evento + + +; tecla +.c: mov eax,2 ; getkey + int 0x40 + ;cmp al, 1 + ;jnz .a + cmp ah, 'w' + jne .a1 + add [end_base], 0x200 + jmp main ; +.a1: cmp ah, 's' + jne .a2 + cmp [end_base], dword 0x80000000 + jbe .a2 + sub [end_base], 0x200 + jmp main ; +.a2: cmp ah, 'e' + jne .a3 + add [end_base], 0x10 + jmp main ; +.a3: cmp ah, 'd' + jne .b1 + cmp [end_base], dword 0x80000000 + jbe .b1 + sub [end_base], 0x10 +.b1: jmp main + + +; atualiza apenas o codigo hex / ascii +.h: + call hex_loop +; inc [contador] ; usado apenas para testar a dinamica + jmp .a ; retorna para buscar novo evento + + +monta_quadro: + + ; posiчуo inicial, subfunчуo 1 + + mov eax,12 + mov ebx,1 + int 0x40 + + ; Desenha o quadro + + mov eax,0 ; funчуo 0 : define e monta o quadro + mov ebx,100*65536+480 ; [x pos] *65536 + [x lar] + mov ecx,100*65536+440 ; [y pos] *65536 + [y alt] + mov edx,[cor_janela] ; cor area RRGGBB + mov edi,titulo ; Titulo + int 0x40 + + ; escreve texto no quadro (barra superior) + + mov edi,[cor_janela] + mov eax,4 + mov ecx, [cor_texto] + mov ebx,8*65536+8 + mov edx,teste + int 0x40 + + add ebx,11 ; adiciona espaчo na coord y + + mov eax,4 + mov ecx, [cor_texto] + mov edx,barra1 + int 0x40 + + call hex_loop + + ; posiчуo final, subfunчуo 2 + +.d: mov eax,12 + mov ebx,2 + int 0x40 + + ret + + ; buscar conteudo da memoria para mostrar + +hex_loop: + xor eax, eax + mov ebx, [end_base] ; endereчo base + + ; imprime o endereчo + + mov edx, 8*65536+40 ; posiчуo inicial hex + mov [pos_ascii], edx + add [pos_ascii], 360*65536 ; posiчуo inicial ascii + mov word [pos_x], 0 + mov al, [quant_linhas] + mov edi,[cor_janela] + +.c: push eax ; + push edx ; + + push ebx ; salva endereчo base + mov al, 47 + mov ecx, ebx ; imprime o endereчo + mov ebx, 0x00080100 + mov esi, [cor_endereco] + int 0x40 + pop ebx ; + + add edx, 60*65536 ; pula 8 espaчos mais alguma coisa + + ; busca hexcode + + mov esi, [cor_hexcode] + mov al, 4 + +.b: push eax ; ----------------------------------------------------------ok + + mov al, 72 ; ebx= endereчo de leitura (nao funcionou...) change this service to another + int 0x40 ; retorna ecx= dword da posiчуo ebx + + push ebx ; ----------------------------------------------------------ok + mov ebx, 0x00020100 ; 2 digitos, modo hex + mov al, 4 + +.a: push eax ; controle -------------------------------------------------ok + push ecx ; codigo + push edx ; posiчуo + and ecx, 0xff + mov al, 47 + int 0x40 + call imprime_car$ + pop edx ; + pop ecx ; + shr ecx, 8 + add edx, (18)*65536 + pop eax ; ----------------------------------------------------------ok + dec al + jnz .a + + pop ebx ; ----------------------------------------------------------ok + add ebx, 4 ; soma 4 ao endereчo base + pop eax ; ----------------------------------------------------------ok + dec al ; imprimir mais 4 vezes incrementando ebx em 4 + jnz .b + + pop edx ; + add edx, 10 ; + + ; imprime a string ascii + + push ebx + push edx + mov al, 4 + mov ebx, [pos_ascii] ; endereчo na tela + mov edx, ascii_string ; endereчo da string + or ecx, [cor_ascii] ; cor + int 0x40 + mov [ascii_x], byte 0 + add [pos_ascii], 10 + pop edx + pop ebx + + pop eax ; + dec al + jnz .c + ret + +imprime_car$: ; ecx tem o caractere a imprimir + + push ebx + xor ebx, ebx + mov bl, [ascii_x] + or cl, cl + jnz .c + mov cl, 0x20 +.c: mov [ebx+ascii_string], cl + inc [ascii_x] + pop ebx + ret + + +; para acessar a memoria do sistema: +; +; acessar a base das tabelas de paginaчao +; com o endereчo buscar o descritor de pagina +; ler o endereчo fэsico ndo descritor +; ou buscar a pagina do sistema e ler nele o endereчo fisico + +; DATA AREA +align 0x10 +;contador dd 0 ; para testar a dinamica +cor_janela dd 0x346f72c3 ; atrib, tipo, corRGB +cor_texto dd 0xc0fffffe ; fonte variavel, cor branca +cor_endereco dd 0xc0fffffc +cor_hexcode dd 0xc0fffffd +cor_ascii dd 0xc0fffffa +pos_x db 0 +pos_y db 0 +quant_linhas db 0x20 +ascii_x db 0 +end_base dd 0x80000000 ; ok +pos_ascii dd 0 +ascii_string rb 0x11 +reservado rb 3 + + +titulo db 'Mostra a memoria do sistema operacional',0 + +teste db '-------- ------------------ Hex Code ------------------- -- A S C I I --',0 +barra1 db 'Address: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 0123456789abcdef',0 + + +align 0x10 +I_END: + + +; service 72 from system calls +; +; must contain: +; mov eax, [eax] +; mov [esp+32], eax +; ret + +