WinMain.asm Код (Text): .486 .model flat,stdcall option casemap :none ;///////////////////////////////////////////////////////////////////////////// include \MASM32\INCLUDE\Windows.inc include \MASM32\INCLUDE\User32.inc include \MASM32\INCLUDE\Kernel32.inc ;///////////////////////////////////////////////////////////////////////////// includeLib \MASM32\LIB\User32.lib includeLib \MASM32\LIB\Kernel32.lib ;///////////////////////////////////////////////////////////////////////////// .const ;///////////////////////////////////////////////////////////////////////////// .data lpCaption db "Caption",0 ;///////////////////////////////////////////////////////////////////////////// .data? ;///////////////////////////////////////////////////////////////////////////// .code _start: ;///////////////////////////////////////////////////////////////////////////// CALL GetCommandLineA ;Kernel32.dll CALL _wincmdln ;WinMain.asm PUSH NULL ;lpModuleName CALL GetModuleHandleA ;Kernel32.dll PUSH ESI ;lpCmdLine PUSH EAX ;hInstance CALL WinMain ;WinMain.asm PUSH NULL ;uExitCode CALL ExitProcess ;Kernel32.dll ;///////////////////////////////////////////////////////////////////////////// _wincmdln Proc MOV ESI,EAX MOV AL,BYTE PTR DS:[ESI] CMP AL,34 ;ASCII (") 22h JNZ _exit ;переход, если флаг Z неактивен INC ESI ;удаляем символ ASCII (") 22h _loop: MOV AL,BYTE PTR DS:[ESI] INC ESI ;удаляем первый символ CMP AL,34 ;ASCII (") 22h JE _finish ;переход, когда активен флаг Z JMP _loop ;безусловный переход _finish: INC ESI ;удаляем символ ASCII (") 22h MOV AL,BYTE PTR DS:[ESI] CMP AL,32 ;ASCII ( ) 20h JE _space ;переход, когда активен флаг Z JMP _exit ;безусловный переход _space: INC ESI ;удаляем пробел _exit: RET _wincmdln Endp ;///////////////////////////////////////////////////////////////////////////// WinMain Proc hInstance :HINSTANCE,lpCmdLine :LPSTR PUSH MB_OK ;uType PUSH offset lpCaption ;lpCaption PUSH lpCmdLine ;lpText PUSH NULL ;hWnd CALL MessageBox ;User32.dll RET WinMain Endp ;///////////////////////////////////////////////////////////////////////////// end _start
Александр Ильин Ошибка в порядке заталкивания параметров в стек. Для соглашения stdcall параметры push-аются в обратном порядке (т.е. справа-налево, если читать определение ф-ции)... http://www.programmersheaven.com/2/Calling-conventions#stdcall А я ничего не понял, у меня только одно сомнения нужна ли проверять и потом удалять пробел.. можно сразу удалять без проверки..
_mikityak_ Можешь словами сформулировать задачу? Удалить из строки символы пробела и двойной кавычки? Если да, тогда можно проще Код (Text): mov esi,eax push esi mov edi,eax; адрес CmdLine a0: lodsb test al,al jz _exit; встретили завершающий ноль, значит конец CmdLine cmp al,' ' jz a0; нашли символ пробела cmp al,'"' jz a0; нашли двойную кавычку stosb jmp a0 ; переходим к следующему символу _exit: stosb; передаем в строку завершающий ноль pop esi Под виндой DS:[ESI] префикс ds: указывать не нужно, он и так на него установлен Код (Text): PUSH MB_OK ;uType PUSH offset lpCaption ;lpCaption PUSH lpCmdLine<-- здесь должено быть lea ecx, lpCmdLine/push ecx PUSH NULL ;hWnd CALL MessageBox
та ладно так загружать.. подумаеш посмотрел "Олькой" на командную строку "Microsoft Visual C++ 6.0" А без префикса ds: еррор получился.. Код (Text): ///////////////////////////////////////////////////////////////////////////// Microsoft (R) Windows (R) Resource Compiler Version 5.2.3690.0 Copyright (C) Microsoft Corporation. All rights reserved. Using codepage 1251 as default Creating rsrc.RES RC: RCPP -CP 1251 -f D:\Masm32\Examples\WinMain\RCa02052 -g D:\Masm32\Examples\W inMain\RDa02052 -DRC_INVOKED -D_WIN32 -pc\:/ -E -I. -I . rsrc.rc. Writing ICON:1, lang:0x409, size 1128 Writing ICON:2, lang:0x409, size 3240 Writing GROUP_ICON:100, lang:0x409, size 34. Writing 24:1, lang:0x409, size 780 ///////////////////////////////////////////////////////////////////////////// Microsoft (R) Windows Resource To Object Converter Version 5.00.1736.1 Copyright (C) Microsoft Corp. 1992-1997. All rights reserved. ///////////////////////////////////////////////////////////////////////////// Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: WinMain.asm WinMain.asm(42) : error A2070: invalid instruction operands ----------------------------------------------------------------------------- Error Macro Assembler Для продолжения нажмите любую клавишу . . . кароче под строкой _finish: удаляю полностю.. Код (Text): INC ESI ;удаляем символ ASCII (") 22h типа ненужна ета строк.. а так аставляю как есть.. А ет чо такое ???
_mikityak_ Mikl___ > "Можешь словами сформулировать задачу?" +1 Mikl___ PUSH lpCmdLine<-- здесь должено быть lea ecx, lpCmdLine/push ecx Заблуждаешься.
"Можешь словами сформулировать задачу?" нет задачи.. просто взял Microsoft Visual C++ 6.0 зделал пустой проект и захотелось Олькой посмотреть командную строку, да крива получилась.. но то што получилось хотел узнать какие имено ошыпки допустил.. CommandLineToArgvW - потому и ненадо..
_mikityak_ хотел узнать какие имено ошыпки допустил Судя по твоему коду из #1 и заголовку темы, ты просишь проверить _wincmdln. Предполагаю, что ты хотел, чтобы она возвращала адрес того места командной строки, с которого начинаются параметры. Я прав?
_mikityak_ 32 == 20h == ' ' 48 == 30h == '0' итд попрубуйте для начала просто вывести всю командную строку без преобразований для потома, при операциях со строками никогда не забывайте проверять на конец строки вы выгоняете всю комстроку, а затем выкидываете конечный 0
q_q ну ДА )) (и не ждал я вариантов как можно достать ком-строку.. я знаю што мой неочень.. просто скажыте если там чото нетак как для такова) п.с спишу потому по русски карлякаю как магу
_mikityak_ просто скажыте если там чото нетак Есть. Например; 1) если имя исполняемого модуля не заключено в двойные кавычки, то сработает первый условный переход - JNZ _exit и на выходе из _wincmdln esi будет указывать не на параметры, а на имя исполняемого модуля; 2) в цикле между _loop и _finish перед проверкой на завершающую двойную кавычку уже есть INC ESI, т.е. двойная кавычка пропущена, получается, что INC ESI после метки _finish пропускает разделитель между именем исполняемого модуля и первым параметром, а если параметров нет, то следующую команду MOV AL,BYTE PTR DS:[ESI] можно расценивать как попытку прочитать за пределами строки; 3) между именем исполняемого модуля и первым параметром может быть несколько пробелов; 4) в качестве разделителя между именем исполняемого модуля и параметрами может быть использован знак(ки) табуляции.