Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
MASM

Обработка параметров командной строки

28.10.2019, 16:28. Показов 6861. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день
Не могу решить задачку, помогите пожалуйста

Задача: написать программу на ассемблере, которая в зависимости от количества заданных параметров:
а) открыть файл с именем [параметр1] и отобразить его содержимое в окне консоли. Пример:
c:\program1.exe parametr1
б) создать файл с именем [параметр1] и записать содержимое в него [параметр2] Пример:
c:\program1.exe parametr1 parametr2
в) отобразить сообщение о неверном количестве параметров. Пример:
c:\program1.exe parametr1 parametr2 parametr3
c:\program1.exe
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2019, 16:28
Ответы с готовыми решениями:

Обработка параметров командной строки
Решение должно представлять собой самостоятельное приложение командной строки, входной файл для которого задается ключом -i <имя...

Обработка параметров командной строки
Собственно сабж. К примеру если мы напишем в консоле ping www.ru -t , то в программу ping передастся параметр -t который говорит, что...

Обработка параметров командной строки
Обеспечить обработку параметров командной строки для определения режима работы программы: параметр "-h" или "-help":...

48
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
01.11.2019, 22:04
Студворк — интернет-сервис помощи студентам
Ansi или Unicode, какая разница, тут вопрос, в том, что у ТС нет опыта написания программ. И мы будем как pcmax'у по букве молотком вбивать знания..

Добавлено через 4 минуты
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Хорошо, пока не буду лезть в тему.
Да без проблем, помогайте, но это нужно делать с помощью подсказок, чтобы ТС, понимал, что он делает. И выполнял все по шагам.


Пока ждем шаг №1.
1
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
03.11.2019, 15:55  [ТС]
ФедосеевПавел,
Вот имею код который считывает данные с файла(Задача а))
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
.586
include B:\masm32\include\masm32rt.inc
 
.data?
hInstance dd ?
hFile dd ?
tmpV dd ?
fSize dd ?
hBuff dd ?
readBytes dd ?
 
argc dd ?
argv dd ?
.data
 
txt2 db "Blad otwarcia pliku.", NULL
txt3 db "Blad odczytu pliku.", NULL
txt4 db "Blad alokacji pamieci.", NULL 
fName db "plik.txt"
 
.code
Start:
INVOKE AllocConsole
INVOKE GetStdHandle, STD_OUTPUT_HANDLE
mov hInstance, eax
 
        
INVOKE CreateFile,ADDR fName, GENERIC_READ, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0
mov hFile, eax 
 
    .IF eax==INVALID_HANDLE_VALUE    
        INVOKE lstrlen, OFFSET txt2
        INVOKE WriteConsole, hInstance, OFFSET txt2, eax,ADDR tmpV, NULL
        jmp @end
    .ENDIF
 
    INVOKE GetFileSize,hFile,0
    mov fSize, eax
 
    INVOKE VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE     
    .IF eax == NULL
        INVOKE lstrlen, OFFSET txt4
        INVOKE WriteConsole, hInstance,OFFSET txt4, eax,OFFSET tmpV, NULL          
    .ELSE
        mov hBuff, eax
        INVOKE ReadFile, hFile, eax, fSize, OFFSET readBytes, 0
 
        .IF eax == -1
            INVOKE lstrlen, OFFSET txt3
            INVOKE WriteConsole, hInstance,OFFSET txt3, eax,ADDR tmpV, NULL    
        .ELSE
            INVOKE WriteConsoleW, hInstance, hBuff, fSize,OFFSET tmpV, NULL
        .ENDIF
    .ENDIF
 
    INVOKE VirtualFree,eax,OFFSET fSize,MEM_RELEASE  
    INVOKE CloseHandle, hFile
 
 
@end:
 
 
INVOKE FreeConsole
INVOKE ExitProcess,0
 
END Start
И вот написал код который создаёт файл и записывает к нему данные(Задача б))

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
.586P
.MODEL FLAT,stdcall
 
include    B:\masm32\include\masm32rt.inc
 
 
 
STD_OUTPUT_HANDLE                    EQU -11
INVALID_HANDLE_VALUE                 EQU -1
GENERIC_WRITE                        EQU 40000000h
OPEN_ALWAYS                          EQU 4
FILE_ATTRIBUTE_ARCHIVE               EQU 20h
 
 
 
 
 
EXTERN AllocConsole@0:NEAR
EXTERN FreeConsole@0:NEAR
EXTERN GetStdHandle@4:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN GetCommandLineW@0:NEAR
EXTERN CommandLineToArgvW@8:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN lstrlenA@4:NEAR
EXTERN lstrlenW@4:NEAR
EXTERN CreateFileW@28:NEAR
EXTERN CloseHandle@4:NEAR
EXTERN WriteFile@20:NEAR
EXTERN CharToOemA@8:NEAR
 
 
 
 
 
.DATA?
WriteBytes  DD ?
HANDL       DWORD ?
HFILEZ      DD ?
ARGC        DD ?
ARGV        DD ?
LENS        DD ?
 
 
 
.DATA
NazwaPliku DW 300 DUP(0)
STR1       DB "Неправильное количество параметров",10,13,0
STR2       DB "Проблема с созданием файла",10,13,0
 
 
 
.CODE
 
 
Start:
 
 
CALL AllocConsole@0 
 
PUSH STD_OUTPUT_HANDLE  
 
CALL GetStdHandle@4
 
MOV HANDL,EAX
 
 
CALL GetCommandLineW@0
 
 
PUSH OFFSET ARGC
PUSH EAX
CALL CommandLineToArgvW@8
MOV  ARGV,EAX
 
 
MOV EBX,3
 
CMP ARGC,EBX
JNE ZLEPARAMETRY
 
 
MOV EDI,ARGV
ADD EDI,4
MOV EAX,[EDI]
 
PUSH 0
PUSH FILE_ATTRIBUTE_ARCHIVE
PUSH OPEN_ALWAYS                       
PUSH 0
PUSH 0
PUSH GENERIC_WRITE
PUSH EAX
CALL CreateFileW@28
 
MOV HFILEZ,EAX
 
 
CMP EAX,INVALID_HANDLE_VALUE  
JNE PLIKOK
 
 
PUSH OFFSET STR2
PUSH OFFSET STR2
CALL CharToOemA@8
 
 
MOV EBX ,OFFSET STR2
PUSH EBX
CALL lstrlenA@4
 
 
 
PUSH 0
PUSH OFFSET LENS
PUSH EAX
PUSH EBX
PUSH HANDL
CALL WriteConsoleA@20
JMP KONCZ
 
PLIKOK:
 
 
;считывем второй параметр
 
 
MOV EDI,ARGV
ADD EDI,8
MOV EBX,[EDI]
 
PUSH EBX
CALL lstrlenW@4
 
XOR ESI,ESI
MOV ESI,2
MUL ESI
 
PUSH 0
PUSH OFFSET WriteBytes
PUSH EAX
PUSH EBX
PUSH HFILEZ
CALL WriteFile@20
 
 
 
PUSH HFILEZ  
CALL CloseHandle@4
 
JMP KONCZ
 
 
ZLEPARAMETRY:
 
PUSH OFFSET STR1
PUSH OFFSET STR1
CALL CharToOemA@8
 
MOV EBX ,OFFSET STR1
PUSH EBX
CALL lstrlenA@4
 
 
PUSH 0
PUSH OFFSET LENS
PUSH EAX
PUSH EBX
PUSH HANDL
CALL WriteConsoleA@20
 
KONCZ:
 
CALL FreeConsole@0
 
PUSH 0
 
CALL ExitProcess@4
 
RET
 
END Start
Можете пожалуйста помочь их объединить в один код
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8673 / 4510 / 1670
Регистрация: 01.02.2015
Сообщений: 13,939
Записей в блоге: 13
03.11.2019, 16:04
Пусть в переменной argc находится количество аргументов (параметров) командной строки.
Assembler
.const
  aszError db 'Error', 0
.code
.......
mov eax, [argc]
cmp eax, 1
je @@OneArg
cmp eax, 2
je @@TwoArg
;вывести сообщение об ошибке
        invoke  WriteConsoleW, hConsoleOutput, ADDR aszError,\
                LENGTHOF aszError - 1, ADDR BufLen, NULL
jmp @@Exit
 
@@OneArg:
........................
jmp @@Exit
 
@@TwoArg:
........................
jmp @@Exit
 
@@Exit:
INVOKE ExitProcess,0
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
03.11.2019, 16:09  [ТС]
ФедосеевПавел,
Это вы задачу в) написали ?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8673 / 4510 / 1670
Регистрация: 01.02.2015
Сообщений: 13,939
Записей в блоге: 13
03.11.2019, 16:28
Задачу в) и остальные. Ведь если вы правильно решили остальные задачи - их код достаточно скопировать в итоговый исходник.

На C это было бы
C
1
2
3
4
5
6
7
8
9
10
11
  if(argc==1)
  {
  //код для задания а)
  }
  else
  if(argc==2)
  {
  //код для задания б)
  }
  else
    printf("Error");
Добавлено через 4 минуты
Я не верю, что вы решили два первых задания - очень уж разный стиль вызова WinAPI и общее оформление.
А сам за вас делать не хочу, поэтому объединять не буду, чтобы не услышать от вас: "Пока вы не полезли - всё работало, а теперь исправляйте - не знаю, что вы с моим идеальным кодом натворили".
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
03.11.2019, 16:44  [ТС]
ФедосеевПавел, первый код задачу а) я нашёл.
второй код я сам уже писал

Добавлено через 4 минуты
То есть нужно там где
Assembler
1
2
3
@@OneArg:
........................
jmp @@Exit
вставить первый код

а там где
Assembler
1
2
3
@@TwoArg:
........................
jmp @@Exit
второй код

я правильно понял?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8673 / 4510 / 1670
Регистрация: 01.02.2015
Сообщений: 13,939
Записей в блоге: 13
03.11.2019, 16:56
Да.

Добавлено через 7 минут
Только вывод сообщения при ошибке переделайте под собственный стиль.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
03.11.2019, 16:56
Цитата Сообщение от Programist_r Посмотреть сообщение
Это вы задачу в) написали ?
Он Вам написал практически всю программу
@@OneArg: . . . . - это код,который работает с одним аргументом;
@@TwoArg: . . . . - это код который работает с двумя аргументами;
Но без анализа командной строки и получения argc.
Т.к. Вы это должны были сделать сами.
Цитата Сообщение от Constantin Cat Посмотреть сообщение
1)определить количество параметров командной строки.
Смотрите Ваши действия пошагам:
Цитата Сообщение от Constantin Cat Посмотреть сообщение
пошаговая инструкция:
У Вас есть пример, как получить командную строку, она в заголовке окна, см. картинку.
Её, как-то получили и вывели.
Вместо того,чтобы сосредоточится на рекомендациях Вы лезете в тырнет и копипастите, ч/з что.
Ваш код должен быть тут:
Assembler
1
2
3
.code
.......ТУТ, ТУТ, ТУТ
mov eax, [argc]
Миниатюры
Обработка параметров командной строки  
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
03.11.2019, 17:22
Programist_r, чтобы написать код Вашего задания нужно около часа времени. Но его можно написать по разному, к примеру на ФАСМ или ТАСМ или в стиле АТХ и дать Вам код, Вы его под МАСМ не переделаете и за месяц(тут можно даже тотализатор организовывать и делать ставки, что в месяц Вы несправитесь, с перекодированием кода в масм).

Хотите научится писать программы, выполняйте действия по шагам.
И помните, Вы пока между: Анализом, Проэктированием и Кодированием(АПК).

Помните, что если в АПК, не выполнить первые две буквы, то с третей у Вас ну ни как не получится.
И это не важно какой язык программирования. Программа - код на основе спроэктированого алгоритма, который был получен на основе анализа.
1
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
03.11.2019, 17:35  [ТС]
Constantin Cat,
обещаю разобраться, просто сейчас времени не хватает, как всё своё свободное время трачу на другие проекты на другом языке програмирования

соединил код в один, компилируется , но когда задаю параметры то ничего не происходит
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8673 / 4510 / 1670
Регистрация: 01.02.2015
Сообщений: 13,939
Записей в блоге: 13
03.11.2019, 17:49
Значит программа требует отладки.
Выводите на экран количество параметров, чтобы понять место ошибки - неправильное определение количества параметров или ваши фрагменты кода глючат.
Также добавьте вывод на экран отладочных строк в каждой ветке условия - "One Arg", "Two Arg", а "Error" и так должен быть.
Делайте отладочную печать.
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
03.11.2019, 18:06  [ТС]
ФедосеевПавел, знать бы ещё как в ассемблере делать отладку, на C++ и C# прекрасно знаю как

Добавлено через 2 минуты
тут простую программу написать неделю уже не могу, а ещё отладку учить как пользоваться

Добавлено через 2 минуты
ФедосеевПавел,
можете пожалуйста помочь соединить коды в один
мне сдать это задание нужно уже завтра, пожалуйста
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8673 / 4510 / 1670
Регистрация: 01.02.2015
Сообщений: 13,939
Записей в блоге: 13
03.11.2019, 18:25
Я соединю, но править сами коды не буду - что они делают, то и будут делать - это на вашей совести, т.к. именно вы утверждаете их правильность.

Ваш код оформлю в виде двух процедур - это и нагляднее и претензий ко мне меньше.
1
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
03.11.2019, 18:27  [ТС]
ФедосеевПавел, хорошо спасибо большое
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
03.11.2019, 19:01
Цитата Сообщение от Programist_r Посмотреть сообщение
обещаю разобраться, просто сейчас времени не хватает, как всё своё свободное время трачу на другие проекты на другом языке програмирования
соединил код в один, компилируется , но когда задаю параметры то ничего не происходит
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Вы пока между: Анализом, Проэктированием и Кодированием(АПК).
А - анализ данных;
П - проэктирование алгоритма на основе Анализа;
К - написание кода по алгоритму.
Это "жизнь" прогаммы:Задача,Анализ,Проэктирование.Кодирование,Тестирование(тут можно даже анализ пересмотреть и начать снова), Сопровождение(тут можно даже анализ пересмотреть и начать снова).
И это не важно какой ЯП(язык программирования) Вы используете эти буквы - будут Вашим кошмаром:ЗАПКТС
Вы думаете, что: Сшники или Шарпонутые, Паскльщики+, Перловцы, Питоновцы или ПХиПи, не знают что это. Для них С, хорошо, если новая версия супортит старую, А если как 64-х послали одномоментно 16-х. И всё, пиши по новой.


01.11.2019, 13:39 MASM Обработка параметров командной строки
Говорил:
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Не пытайтесь написать ВСЁ сразу, Вы так больше запутаетесь.
Разбейте свою задачу на подзадачи:
Сообщение от Programist_r
Задача: написать программу на ассемблере, которая в зависимости от количества заданных параметров:
1)определить количество параметров командной строки.
Напишите только этот код И БОЛЬШЕ НИЧЕГО.
Уже потом в правильный базовый код будете вставлять другие подзадачи!
Добавлено через 16 минут
Цитата Сообщение от Programist_r Посмотреть сообщение
знать бы ещё как в ассемблере делать отладку, на C++ и C# прекрасно знаю как
Пишите код на С или Шарпе. С будет оптимальным вариантом , исполняшку можно дизасемблить и взятьнужные куски.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8673 / 4510 / 1670
Регистрация: 01.02.2015
Сообщений: 13,939
Записей в блоге: 13
03.11.2019, 20:17
Как странно - не могу вывести в консоль параметры командной строки.
Запускаю из пакетного файла с двумя параметрами
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
        ;получение указателя на командную строку
        invoke  GetCommandLineW
        mov     [lpCmdLine],    eax
        ;получение количества параметров командной строки
        ;и массива параметров (в виде указателей на Unicode строки)
        invoke  CommandLineToArgvW,     [lpCmdLine], ADDR argc
        mov     [argv], eax
        test    eax,    eax
        jnz     @f
                invoke  WriteConsole, hConsoleOutput, ADDR aszCmdLineToArgvError,\
                        LENGTHOF aszCmdLineToArgvError - 1, ADDR BufLen, NULL
                jmp     @@Exit
        @@:
 
        ;информационный вывод - количество параметров в командной строке
        invoke  wsprintfW, ADDR Buffer, ADDR wszMsgCmdLine, [lpCmdLine]
        mov     [BufLen],       eax
        invoke  WriteConsoleW, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        invoke  wsprintfW, ADDR Buffer, ADDR wszMsgARGC, [argc]
        mov     [BufLen],       eax
        invoke  WriteConsoleW, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        mov     esi,    [argv]
        invoke  wsprintfW, ADDR Buffer, ADDR wszMsg0roArg, esi
        mov     [BufLen],       eax
        invoke  WriteConsoleW, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
       mov     esi,    [argv]
        invoke  MessageBoxW, NULL, [esi], addr wszMsgBoxCapt, MB_OK
полный текст исходника с ошибкой
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
.486
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\shell32.inc
        include \masm32\include\masm32.inc
        include \masm32\macros\macros.asm
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\shell32.lib
        includelib \masm32\lib\masm32.lib
.const
        aszMsgCmdLine           db      "Command Line: '%s'", 0Dh, 0Ah, 0
        aszCmdLineToArgvError   db      "Command Line To Argv Error", 0
        UCSTR   wszMsgCmdLine,  "Command Line: '%s'", 0Dh, 0Ah, 0
        UCSTR   wszMsgARGC,     "Params count: %d", 0Dh, 0Ah, 0
        UCSTR   wszMsg0roArg,   "argv[0]: '%s'", 0Dh, 0Ah, 0
        UCSTR   wszMsg1stArg,   "argv[1]: '%s'", 0Dh, 0Ah, 0
        UCSTR   wszMsg2ndArg,   "argv[2]: '%s'", 0Dh, 0Ah, 0
        UCSTR   wszMsg3rdArg,   "argv[3]: '%s'", 0Dh, 0Ah, 0
        UCSTR   wszMsgBoxCapt,  "Caption", 0
        aszPressLeftAlt         db      0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0
.data
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        lpCmdLine       LPWSTR  ?
        argc            dd      ?
        argv            LPWSTR  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
.code
 
start:
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
        ;очистка экрана
        invoke  ClearScreen
 
        ;получение указателя на командную строку
        invoke  GetCommandLineW
        mov     [lpCmdLine],    eax
        ;получение количества параметров командной строки
        ;и массива параметров (в виде указателей на Unicode строки)
        invoke  CommandLineToArgvW,     [lpCmdLine], ADDR argc
        mov     [argv], eax
        test    eax,    eax
        jnz     @f
                invoke  WriteConsole, hConsoleOutput, ADDR aszCmdLineToArgvError,\
                        LENGTHOF aszCmdLineToArgvError - 1, ADDR BufLen, NULL
                jmp     @@Exit
        @@:
 
        ;информационный вывод - количество параметров в командной строке
        invoke  wsprintfW, ADDR Buffer, ADDR wszMsgCmdLine, [lpCmdLine]
        mov     [BufLen],       eax
        invoke  WriteConsoleW, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        invoke  wsprintfW, ADDR Buffer, ADDR wszMsgARGC, [argc]
        mov     [BufLen],       eax
        invoke  WriteConsoleW, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        mov     esi,    [argv]
        invoke  wsprintfW, ADDR Buffer, ADDR wszMsg0roArg, esi
        mov     [BufLen],       eax
        invoke  WriteConsoleW, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
        mov     esi,    [argv]
        invoke  MessageBoxW, NULL, [esi], addr wszMsgBoxCapt, MB_OK
 
 
@@FreeAndExit:
        invoke  LocalFree, [argv]
@@Exit:
        ;ожидание нажатия Left Alt
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\
                LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL
        @@WaitForLAlt:
                invoke  GetAsyncKeyState, VK_LMENU
                and     eax,    8000h
        jz      @@WaitForLAlt
        ;завершение программы
        invoke  ExitProcess, 0
 
end start
Все вызовы делаю в Unicode формате.
Вызываю GetCommandLineW, получаю указатель на командную строку в Unicode.
Вызываю CommandLineToArgvW, получаю количество параметров и указатель на массив указателей на Unicode-строки.
Далее - делаю отладочную печать в консоль:
- командной строки
- количества аргументов
- нулевого аргумента argv[0]
Всё кроме argv[0] выводится, а argv[0] - кракозябры. Пробую другой параметр argv[1] - тот же результат.
Заменяю вывод параметра на MsgBox - о чудо! - правильно выводит.

Ведь и командная строка тоже Unicode, а она выводится в консоль теми же средствами (wsprintfW+WriteConsoleW).
Не пойму, что я делаю не так?
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
03.11.2019, 20:44  [ТС]
ФедосеевПавел, то есть у вас тоже не получилось соединить ?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8673 / 4510 / 1670
Регистрация: 01.02.2015
Сообщений: 13,939
Записей в блоге: 13
03.11.2019, 21:00
Я никогда не делаю мегакод. Добавляю функционал и тут же проверяю.

Объединять даже и не начинал. После получения списка параметров попробовал вывести их на экран - сделать тестовую печать (то, что вам недоступно), но получил странные результаты. Остановился и задал вопрос.
Сейчас немного разобрался - результат работы wsprintfW не совсем тот, который я ожидал, а WriteConsoleW работает ожидаемо. Поэтому читаю в интернете, как добиться правильных результатов.

Вы поймите, ваши проблемы безразличны всем кроме вас лично. Если бы не возможность попробовать работать с Unicode, я бы и не начинал. Лично мой интерес - Unicode. Когда разберусь со своим вопросом - и вашим займусь. Что вы думаете - я только и мечтаю целый вечер для чужого человека набирать и отлаживать программу на 1000+ строк? Ха-ха!
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
03.11.2019, 21:02  [ТС]
ФедосеевПавел, по отдельности первый код(а) и второй код(б) работают идеально если можно так сказать

Добавлено через 1 минуту
извинете
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8673 / 4510 / 1670
Регистрация: 01.02.2015
Сообщений: 13,939
Записей в блоге: 13
03.11.2019, 21:30
Разобрался в причинах кракозябр - я неправильно интерпретировал значение argv. А это указатель на массив указателей. Поэтому вывод параметра 2
Assembler
1
2
3
4
5
6
7
        mov     esi,    [argv]
        add     esi,    8
        mov     ebx,    [esi]
        invoke  wsprintfW, ADDR Buffer, ADDR wszMsgArgN, 2, ebx
        mov     [BufLen],       eax
        invoke  WriteConsoleW, hConsoleOutput, ADDR Buffer,
                BufLen, ADDR BufLen, NULL
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2019, 21:30

Удобная обработка параметров командной строки
Всем привет. Когда-то давно писал примитивный аналог grep из Linux на шарпе и сейчас подумываю его улучшить. Идея следующая: в консоль...

функция main обработка параметров командной строки
Подскажите, пожалуйста, зачем могут использоваться параметры командной строки, пример какой-нибудь если можно, только не конкретный :) без...

Обработка параметров командной строки. Можно ли ещё проще?
Всем доброго дня) Экспериментировал с параметрами командной строки, хочу сделать так, чтобы в зависимости от установленных параметров,...

Передача параметров из командной строки
На место text.txt надо передать название файла через командную строку. Что писать в int(main) вроде понятно. Но не так понятно что писать...

Ввод параметров из командной строки
Есть программа, которая состоит из методов обычного калькулятора, сложения строк, проверки строк на зеркальность и метод help. Облазил весь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru