Подскажите пожалуйста по процедурам - когда надо делать уравнивание стека, вида push ebp mov ebp,esp ..тело процедуры leave ret 16 , a)Когда процедура имеет параметры, которые ей передаются; б)Когда в ней есть локальные переменные; в)это не обязательно. Не могу разобраться уже целый день, для чего и когда делают это.
в разных ситуациях по разному.Если какие либо объекты в стеке тебе отслужили и больше не нужны-надо выровнять его.Выравнивать также следует например при вызове сишных функций.бывают разные аспекты короче говоря.
Не компилятся ресурсы Не знал куда писать, но решил все-таки сюда ибо пишу rc для проги на асм. Проблема такая: не компилятся ресурсы. Вылетает с такой ошибкой: undefined keyword or key name: DS_CENTER. если убираю DS_CENTER, пишет что не найдет следующий идентификатор и тд.... не могу понять в чем проблема, так как я уже даже копировал код с туториалов iczelliona - то же самое( вот собственно исходник ресурсов: Code: #define IDC_EDIT 3000 #define IDC_BUTTON 3001 #define IDC_EXIT 3002 #define IDM_GETTEXT 32000 #define IDM_CLEAR 32001 #define IDM_EXIT 32003 MyDialog DIALOG 10, 10, 205, 60 STYLE 0x0004|DS_CENTER|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU|WS_VISIBLE|WS_OVERLAPPED|DS_MODALFRAME|DS_3DLOOK CAPTION "Out first Dialog Box" CLASS "DLGCLASS" { EDITTEXT IDC_EDIT, 15, 17, 111, 13, ES_AUTOHSCROLL|ES_LEFT DEFPUSHBUTTON "Say hello", IDC_BUTTON, 141, 10, 52, 13 PUSHBUTTON "Exit", IDC_EXIT, 141, 26, 52, 13, WS_GROUP } MyMenu MENU { POPUP "Test Controls" { MENUITEM "Get text", IDM_GETTEXT MENUITEM "Clear text", IDM_CLEAR MENUITEM "", 0x0800 /*MFT_SEPARATOR*/ MENUITEM "Exit", IDM_EXIT } }
Требуется написание небольшой программы на ассемблере (поиск числа вхождений символа в строке). Бюджет до 30$ Заполнить строку текстом ФАМИЛИЯ_ИМЯ_ОТЧЕСТВО_, длина строки должна выйти 2200 символов. Найти число вхождений символа "о" в данную строку и занести его в регистр ax Работать надо с "цепочечными командами" Пример оформлеия программы (пример решения задачи на нахождение вхождения символа "а" в строку): Code: MASM MODEL small STACK 256 .data fnd db 0ah,0dh,'Символ найден*! ','$' nochar db 0ah,0dh,'Символ не найден.','$' string db 'Поиск символа в этой строке.',0ah,0dh,'$' .code ASSUME ds:@data,es:@data main: mov ax,@data mov ds,ax mov es,ax mov ah,09h lea dx,string int 21h mov al,'а' cld lea di,string mov cx,28 repne scas string je found failed: mov ah,09h lea dx,nochar int 21h jmp exit found: mov ah,09h lea dx,fnd int 21h exit: mov ax,4c00h int 21h end main
Вот непойму в чем трабла.Есть код: Code: invoke lstrcat,addr get,addr ID invoke lstrcat,addr get,addr get1 invoke MessageBox,0,addr get,0,0 Мы спепляем с get переменную Id,дальше c get переменную get1 и получается какая то фигня.
у меня два варианта: 1)это не строки 2)буфер слишком мал. но т.к. я не экстрасенс то опиши в чем проблема.
Все ясно.Разорался, дело в буфере.Спасибо. Вот еще хотел спросить.написал я 2 функциии к примеру: Code: func1 proc invoke MessageBox,0,0,0,0 func endp func2 proc invoke Sleep,1000 func2 endp И после их вызова,я хочу вызвать любую функцию и не выходит. Code: call func1 call func2 invoke MessageBox,0,0,0,0 Программа завершается после 2 моих функций.
Вот так у меня: Code: .386 .model Flat, StdCall option casemap:none ;###################################### include \masm32\include\kernel32.inc include \masm32\include\windows.inc includelib \masm32\lib\user32.lib include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib ;###################################### .code start: call func1 func1 proc invoke MessageBox,0,0,0,0 func1 endp func2 proc invoke Sleep,1000 func2 endp invoke ExitProcess,0 end start Пробовал вот так: Code: .386 .model Flat, StdCall option casemap:none ;###################################### include \masm32\include\kernel32.inc include \masm32\include\windows.inc includelib \masm32\lib\user32.lib include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib ;###################################### .code start: call func1 invoke ExitProcess,0 func1 proc invoke MessageBox,0,0,0,0 func1 endp func2 proc invoke Sleep,1000 func2 endp end start Но в коцне ошибка...
вот так все работает. Code: call func1 call func2 invoke MessageBox,0,0,0,0 invoke ExitProcess,0 соотв. функции размещаются ПОСЛЕ exitprocess
Code: .386 .model Flat, StdCall option casemap:none ;###################################### include \masm32\include\kernel32.inc include \masm32\include\windows.inc includelib \masm32\lib\user32.lib include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib ;###################################### .code start: call func1 call func2 invoke MessageBox,0,0,0,0 invoke ExitProcess,0 func1 proc invoke MessageBox,0,0,0,0 func1 endp func2 proc invoke Sleep,1000 func2 endp end start После исполнения 2 моих функций вылетает ошибка:
Не могу изменить пароль пользователя. Функция возвращает какую-то ахинею error_io_pending , в мсдн в ее описании такого и близко нет. Как я понял, это значит, что функция еще не отработала свое, т.е. асинхронный ввод вывод? Или что? Masm
Есть код: Code: .data sendgb db 100 dup(?) sends db 'send ',0 prob db ' ',0 upload db 'asdasdasd',0 .code invoke lstrcat,addr sendftp,addr sends invoke lstrcat,addr sendftp,addr upload invoke lstrcat,addr sendftp,addr prob invoke lstrcat,addr sendftp,addr upload invoke CreateFile,addr kom,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov handle,eax invoke WriteFile,handle,addr sendgb,sizeof sendgb,addr check,0 invoke CloseHandle,handle В фаил записывается send asdasdasd asdasdasd и еще всякие нули...Как сделать что бы эти нули не записывались?И переменная upload всегда разная...
Передавать в WriteFile не размер буфера, а размер "печатаемой" информации в нем. То бишь делать lstrlen предварительно.
2 Flisk: Не все так просто. Параметры NetUserChangePassword нужные Вам 1. NULL 2. имя пользователя 3. Старый пароль 4. Новый пароль ! Все параметры в UNICODE ! Code: include netapi32.inc includelib netapi32.lib data login dw "t","o","o","r",0 oldpass dw "r","o","o","t",0 newpass dw "f","u","c","k",0 .code start: invoke NetUserChangePassword,NULL,addr login,addr oldpass,addr newpass .if eax!=NERR_Success invoke MessageBoxW,0,addr newpass,0,MB_OK ;Ошибка! .endif