Форум программистов, компьютерный форум, киберфорум
Assembler: MASM64, х64/long mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 29.10.2020
Сообщений: 102
MASM64

Передача аргументов и вызов функции wsprintfA

15.11.2022, 17:56. Показов 1890. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть 3 строки ,в примере был вызов для 2 строк :
Assembler
1
2
3
4
5
mov rcx,offset MsgBoxText
mov rdx,offset fmt
mov r8,offset s1
mov r9,offset s2
call wsprintfA
Я хочу передать смещение еще одной строки ,чтобы отобразить ее после Memory:
Assembler
1
2
3
fmt db "Vendor ID: %s",13,10
db "CPU: %s",13,10
db "Memory: %d",0
Я не знаю в какой регистр передать смещение 3 строки перед вызовом функции,или нужно делать по другому?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.11.2022, 17:56
Ответы с готовыми решениями:

Вызов функции по количеству аргументов
Привет, есть List<string> mylist; в нем допустим 12 строк. Вопрос есть не кривой вариант передавать по 5 штук в функцию? У меня такой...

Вызов функции с разным количеством аргументов
Функция MyFunc может принимать разное количество аргументов: void MyFunc(int ArgCount, ...) { } Может ли C++ такое: 1....

Вызов динамической функции по адресу с передачей аргументов
Встал я перед такой задачкой, надо написать мини скриптовой ЯП который умеет только функции вызывать, например: main.c void...

1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
15.11.2022, 18:13
Лучший ответ Сообщение было отмечено Pancelet как решение

Решение

Используется стек, как для x86
Пример
вместо push - заранее зарезервировали стек и просто копируют в его область
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        comment*
        -------------------------------------------------------------------------------------------------------
        invoke  FormatMessage,\
                FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS,\
                NULL,\
                LastError,\
                LANG_NEUTRAL OR (SUBLANG_DEFAULT SHL 10),\
                ADDR lpMsgBuf,\
                0,\
                NULL
        -------------------------------------------------------------------------------------------------------
        *
        mov     rcx,    FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS
        xor     edx,    edx
        mov     r8,     rax
        mov     r9d,    LANG_NEUTRAL OR (SUBLANG_DEFAULT SHL 10)
        lea     rax,    lpMsgBuf
        mov     [rsp+20h],      rax
        xor     eax,    eax
        mov     [rsp+28h],      rax
        mov     [rsp+30h],      rax
        call    FormatMessage
Добавлено через 2 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        ;invoke  wsprintf,       lpszString, ADDR szFmtDateTime,\
        ;                        stLocal.wMonth, stLocal.wDay, stLocal.wYear,\
        ;                        stLocal.wHour, stLocal.wMinute
        mov     rcx,    lpszString
        lea     rdx,    szFmtDateTime
        movzx   r8,     stLocal.wDay
        movzx   r9,     stLocal.wMonth
        movzx   rax,    stLocal.wYear
        mov     [rsp+20h],      rax
        movzx   rax,    stLocal.wHour
        mov     [rsp+28h],      rax
        movzx   rax,    stLocal.wMinute
        mov     [rsp+30h],      rax
        xor     eax,    eax
        call    wsprintf
Добавлено через 3 минуты
Целиком программа
Кликните здесь для просмотра всего текста
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
.nolist
option dotname
option casemap: none
        include \masm64\Include64\win64.inc
        include \masm64\Include64\kernel32.inc
        include \masm64\Include64\user32.inc
        include \masm64\Include64\msvcrt.inc
 
        includelib \masm64\Lib64\kernel32.lib
        includelib \masm64\Lib64\user32.lib
        includelib \masm64\Lib64\msvcrt.lib
 
option prologue: none
option epilogue: none
 
.list
 
.data
FILETIME        struc
        dwLowDateTime   DWORD   ?
        dwHighDateTime  DWORD   ?
FILETIME        ends
SYSTEMTIME      struc
        wYear           WORD    ?
        wMonth          WORD    ?
        wDayOfWeek      WORD    ?
        wDay            WORD    ?
        wHour           WORD    ?
        wMinute         WORD    ?
        wSecond         WORD    ?
        wMilliseconds   WORD    ?
SYSTEMTIME      ends
        ;строки идентификации сообщений об ошибке
        szFail          db      "CreateFile", 0
        ;строки форматирования результатов работы программы - времени создания файла
        szFmtDateTime   db      "%02d/%02d/%d  %02d:%02d", 0
        szFmtLastWrite  db      "Last write time is: %s", 0Dh, 0Ah, 0
        ;имя обрабатываемого файла
        szFileName      db      "hello.asm", 0
.data?
        szBuffer        db      MAX_PATH dup(?)
        hFile           HANDLE  ?
.code
 
;-------------------------------------------------------------------------
; Всплывающее окно с сообщением об ошибке.
; В окно выводится:
; 1. сообщение, передаваемое в функцию,
; 2. текст "failed with error",
; 3. код ошибки,
; 4. расшифровка кода ошибки в текстовом виде
; Код процедуры взят с небольшими изменениями из примера
; https://docs.microsoft.com/ru-ru/windows/win32/fileio/listing-the-files-in-a-directory
; Изменения:
; 1. функция StringCchPrintf заменена на wsprintf, т.к. StringCchPrintf отсутствует
;    в библиотеках masm32, а кроме того, она только описывается в strsafe.h и, вероятно,
;    является частью библиотек Visual Studio.
; 2. в DisplayErrorBox переменная dw переименована в LastError.
;-------------------------------------------------------------------------
.data
        szErrorMessage  db      "%s failed with error %d: %s", 0
        szMBError       db      "Error", 0
.code
DisplayErrorBox proc    lpszFunction:LPVOID
        local   lpMsgBuf        :LPVOID
        local   lpDisplayBuf    :LPVOID
        local   LastError       :QWORD
 
        ;т.к. в опциях задано отсутствие эпилога и пролога,
        ;то вычисления выполняем в коде
        ;вычисляем размер фрейма стека - он состоит из
        ; - локальных переменных (округляем до 8 байт)
        LocalsSize      =       ((2*(SIZEOF LPVOID)+1*(SIZEOF QWORD)+7)/8)*8
        ; - фрейма для вызываемых функций (максимальное число параметров у функции FormatMessage - 7 шт.)
        ;размер округляем до 16, т.к. перед вызовом стек был выровнен на границу 16, потом в стек
        ;поместили 8 байт адреса возврата, а при формировании фрейма будет помещён rbp (8 байт)
        FrameSize       =       (((LocalsSize+7*8)+15)/16)*16
        ;и самостоятельно формируем фрейм
        push    rbp
        mov     rbp,    rsp
        sub     rsp,    FrameSize
        ;сохраняем контекст в месте, предоставленном вызывающим кодом
        mov     [rbp+10h],      rcx
        mov     [rbp+18h],      rdx
        mov     [rbp+20h],      r8
        mov     [rbp+28h],      r9
 
        ;Retrieve the system error message for the last-error code
        call    GetLastError
        mov     LastError,      rax
        comment*
        -------------------------------------------------------------------------------------------------------
        invoke  FormatMessage,\
                FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS,\
                NULL,\
                LastError,\
                LANG_NEUTRAL OR (SUBLANG_DEFAULT SHL 10),\
                ADDR lpMsgBuf,\
                0,\
                NULL
        -------------------------------------------------------------------------------------------------------
        *
        mov     rcx,    FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS
        xor     edx,    edx
        mov     r8,     rax
        mov     r9d,    LANG_NEUTRAL OR (SUBLANG_DEFAULT SHL 10)
        lea     rax,    lpMsgBuf
        mov     [rsp+20h],      rax
        xor     eax,    eax
        mov     [rsp+28h],      rax
        mov     [rsp+30h],      rax
        call    FormatMessage
        ;Display the error message and clean up
        ;lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
        ;  (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR));
        mov     rbx,    rax     ;rbx=lstrlen((LPCTSTR)lpMsgBuf)
        lea     ecx,    lpszFunction
        call    lstrlen
        add     rbx,    rax
        add     rbx,    40
        mov     ecx,    LMEM_ZEROINIT
        mov     edx,    ebx
        call    LocalAlloc
        mov     lpDisplayBuf,   rax
        ;
        mov     rcx,    lpDisplayBuf
        lea     rdx,    [szErrorMessage]
        mov     r8,     lpszFunction
        mov     r9,     LastError
        mov     rax,    lpMsgBuf
        mov     [rsp+20h],      rax
        call    wsprintf
        ;invoke  MessageBox,     NULL, lpDisplayBuf, ADDR szMBError, MB_OK
        xor     ecx,    ecx
        mov     rdx,    lpDisplayBuf
        xor     r8,     r8      ;lea     r8,     szMBError
        mov     r9d,    MB_OK
        call    MessageBox
 
        mov     rcx,    lpMsgBuf
        call    LocalFree
        mov     rcx,    lpDisplayBuf
        call    LocalFree
 
        add     rsp,    FrameSize
        pop     rbp
        ret
DisplayErrorBox endp
 
;// GetLastWriteTime - Retrieves the last-write time and converts
;//                    the time to a string
;//
;// Return value - TRUE if successful, FALSE otherwise
;// @hFile     - Valid file handle
;// lpszString - Pointer to buffer to receive string
GetLastWriteTime        proc    @hFile:HANDLE, lpszString:LPTSTR, dwSize:DWORD
        LOCAL   ftCreate:       FILETIME
        LOCAL   ftAccess:       FILETIME
        LOCAL   ftWrite:        FILETIME
        LOCAL   stUTC:          SYSTEMTIME
        LOCAL   stLocal:        SYSTEMTIME
        LOCAL   dwRet:          QWORD
 
        ;т.к. в опциях задано отсутствие эпилога и пролога,
        ;то вычисления выполняем в коде
        ;вычисляем размер фрейма стека - он состоит из
        ; - локальных переменных (округляем до 8 байт)
        LocalsSize      =       ((3*(SIZEOF FILETIME)+2*(SIZEOF SYSTEMTIME)+1*(SIZEOF QWORD)+7)/8)*8
        ; - фрейма для вызываемых функций (максимальное число параметров у функции FormatMessage - 7 шт.)
        ;размер округляем до 16, т.к. перед вызовом стек был выровнен на границу 16, потом в стек
        ;поместили 8 байт адреса возврата, а при формировании фрейма будет помещён rbp (8 байт)
        FrameSize       =       (((LocalsSize+7*8)+15)/16)*16
        ;и самостоятельно формируем фрейм
        push    rbp
        mov     rbp,    rsp
        sub     rsp,    FrameSize
        ;сохраняем контекст в месте, предоставленном вызывающим кодом
        mov     [rbp+10h],      rcx
        mov     [rbp+18h],      rdx
        mov     [rbp+20h],      r8
        mov     [rbp+28h],      r9
 
        ;// Retrieve the file times for the file.
        ;invoke  GetFileTime,    @hFile, ADDR ftCreate, ADDR ftAccess, ADDR ftWrite
        mov     rcx,    @hFile
        lea     rdx,    ftCreate
        lea     r8,     ftAccess
        lea     r9,     ftWrite
        call    GetFileTime
        test    rax,    rax
        jz      @@Exit
 
        ;// Convert the last-write time to local time.
        ;invoke  FileTimeToSystemTime, ADDR ftWrite, ADDR stUTC
        lea     rcx,    ftWrite
        lea     rdx,    stUTC
        call    FileTimeToSystemTime
        ;invoke  SystemTimeToTzSpecificLocalTime, NULL, ADDR stUTC, ADDR stLocal
        xor     ecx,    ecx
        lea     rdx,    stUTC
        lea     r8,     stLocal
        call    SystemTimeToTzSpecificLocalTime
 
        ;// Build a string showing the date and time.
        ;invoke  wsprintf,       lpszString, ADDR szFmtDateTime,\
        ;                        stLocal.wMonth, stLocal.wDay, stLocal.wYear,\
        ;                        stLocal.wHour, stLocal.wMinute
        mov     rcx,    lpszString
        lea     rdx,    szFmtDateTime
        movzx   r8,     stLocal.wDay
        movzx   r9,     stLocal.wMonth
        movzx   rax,    stLocal.wYear
        mov     [rsp+20h],      rax
        movzx   rax,    stLocal.wHour
        mov     [rsp+28h],      rax
        movzx   rax,    stLocal.wMinute
        mov     [rsp+30h],      rax
        xor     eax,    eax
        call    wsprintf
@@Exit:
        add     rsp,    FrameSize
        pop     rbp
        ret
GetLastWriteTime        endp
 
WinMain proc
        ;формирование фрейма стека на весь код основной программы
        ;с учётом максимального количества параметров среди вызываемых функций
        sub     rsp,    48h
        mov     rbp,    rsp
        ;открытие файла на чтение
        ;invoke  CreateFile,     ADDR szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,\
        ;                        OPEN_EXISTING, 0, NULL
        lea     rcx,    szFileName
        mov     edx,    GENERIC_READ
        mov     r8d,    FILE_SHARE_READ
        xor     r9d,    r9d
        mov     eax,    OPEN_EXISTING
        mov     [rsp+20h],      rax
        xor     eax,    eax
        mov     [rsp+28h],      rax
        mov     [rsp+30h],      rax
        call    CreateFile
        mov     [hFile],        rax
        ;проверка отсутствия ошибок при открытии файла
        cmp     rax,    INVALID_HANDLE_VALUE
        jne     @f
                ;вывод диагностического сообщения об ошибке и завершение программы
                ;invoke  DisplayErrorBox,        ADDR szFail
                lea     rcx,    szFail
                call    DisplayErrorBox
                jmp     @@Exit
        @@:
        ;вывод времени последней записи в файл
        ;invoke  GetLastWriteTime,       hFile, ADDR szBuffer, MAX_PATH
        mov     rcx,    hFile
        lea     rdx,    szBuffer
        mov     r8d,    MAX_PATH
        call    GetLastWriteTime
        ;invoke  __imp_printf,   ADDR szFmtLastWrite, ADDR szBuffer
        lea     rcx,    szFmtLastWrite
        lea     rdx,    szBuffer
        xor     eax,    eax
        call    __imp_printf
        ;завершение программы
        call    __imp__getch
@@Exit:
        xor     ecx,    ecx
        call    ExitProcess
WinMain endp
 
end
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2022, 18:13
Помогаю со студенческими работами здесь

Передача аргументов функции
Добрый день! Только начала писать на этом языке. И времени особо разбираться во всех деталях нет, к сожалению. При написании кода...

Передача аргументов в функции
Ребят, никогда раньше не задумывался каким же образом передаются аргументы. Сейчас же дошел до передачи аргументов через указатель и...

Передача аргументов функции
Всем привет. Писал код не зная, правильно ли это. В общем застрял на составлении прототипов функции и функции мэин. И ещё, можно ли так как...

Передача аргументов функции
Вот такие записи, что означают, что будет происходить: function myfucnct(array $elems) function myfucnct(string $elems) function...

Передача аргументов функции
В книге Стенли Липпмана C++ Primer дошел до программы, которая выполняет замену слов в одном файле, которые указаны в другом. Например, ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru