Я создаю файл в NASM 64, используя CreateFileA в Windows API. Вчера я опубликовал вопрос по этому вопросу, который принес несколько полезных комментариев. Сегодня я написал этот раздел на C и скомпилировал его с помощью компилятора Pelles C, и получил разборку из x64dbg, чтобы я мог использовать вывод в NASM. Я поместил код разборки в свой проект NASM, и вот программа в NASM, какая она есть сейчас:
CreateAuditFile:
sub rsp,38
xor eax,eax
mov qword [rsp+30],rax
mov eax,80
mov dword [rsp+28],eax
mov eax,2
mov dword [rsp+20],eax
xor r9,r9
xor r8d,r8d
mov edx,40000000
mov rcx,FileName_1
;lea rcx,[rel FileName_1]
call CreateFileA
call GetLastError
mov rdi,FileAuditString ; not from the disassembly
mov [rdi],rax ; not from the disassembly
xor eax,eax
add rsp,38
ret
Это разборка этого кода C (выполняется как консольное приложение):
int main(void)
{
char* File_Name ="C:\\Audit_File_P1";
HANDLE hFile;
hFile = CreateFileA(
File_Name,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
}
Это работает в C, но в NASM возвращает код ошибки 87, «неверный параметр». Я заметил две вещи: (1) первая строка - это sub rsp, 38, которая является нечетным числом и не выровнена по 16 байтам; (2) для имени файла (FileName_1), разборка показывает
"lea rcx, qword ptr ds: [140006270]", но в NASM мы используем "mov rcx, FileName_1" вместо lea, где строка имени файла определена в разделе .data, как здесь (FileName_1: db "c: \ AuditFile_1.txt», 0). Кроме того, он вставляет параметр qword в [rsp + 30] и dword в [rsp + 28], но dword требуется четыре байта, а не два, что кажется неправильным, но это работает в версии C.
Итак, мой вопрос: какой параметр (параметры) неверен?
Большое спасибо.