Faike
Хм, кстати, а как добавить ассемблер в c++ код используя объектный файл ассемблера?
The Bird of Hermes
Ему линкер не нужен
The Bird of Hermes
Хм, кстати, а как добавить ассемблер в c++ код используя объектный файл ассемблера?
Вот их надо вместе линковать и указывать внешние символы
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
так "з" или "с"?
Aiwan \ (•◡•) / _bot
Можно простой пример?
бери любой из примеров сишки
Faike
точно так же как сишный объектный файл
Что за сишный объектный файл?
Aiwan \ (•◡•) / _bot
Хм, кстати, а как добавить ассемблер в c++ код используя объектный файл ассемблера?
а что тогда это? по мне так это одно и тоже. ты как считаешь?
Alexey
Что за сишный объектный файл?
Masm - это и есть компилятор
Faike
а что тогда это? по мне так это одно и тоже. ты как считаешь?
Ну типа, файл .asm переделывается компилером в .o
Faike
Я хз
Aiwan \ (•◡•) / _bot
Ну типа, файл .asm переделывается компилером в .o
файл .с тоже превращается в .о более того, файл .cpp и .pas тоже превращается в .o
Aiwan \ (•◡•) / _bot
Обычно я получаю сразу exe файл на выходе
запусти чистый компиль (не общую оболочку инструмента) и покажи что получилось?
Alexey
Обычно я получаю сразу exe файл на выходе
Смысле обычно? А что еще у тебя получалось?
Aiwan \ (•◡•) / _bot
Alexey
Aiwan \ (•◡•) / _bot
Через cmake 100%
не факт, есть ещё gcc, clang
Faike
Faike
Через cmake 100%
Я ненавижу cmake
Faike
Я ненавижу cmake
Никогда в жизни не буду пользоваться им
Aiwan \ (•◡•) / _bot
Microsoft visual studio
ну это иде, а не компиль, там много действий скрыто. ты ручками попробуй компильнуть
Alexey
Через cmake 100%
Ну вот мои и 100% :(
Faike
Сразу в exe напрямую
Aiwan \ (•◡•) / _bot
Ну, я компилил через кланг уже, получался exe на выходе
это общая оболочка данного инструмента. теперь найди компиль сишки и вручную компильни что нить
Faike
Всмысле?
Faike
CLANG
Faike
НЕ
Faike
VISUAL
Faike
STUDIO
Faike
CLANG в консоли
Faike
Компренде?
Aiwan \ (•◡•) / _bot
clang-cl.exe - это кимпиль сишки вроде
Aiwan \ (•◡•) / _bot
clang.exe - это общая оболочка (не знаю как правильно назвать) ВСЕГО инструмента (компиль, ликовщик, ассемблер, компиль ресурсов и еще много всего)
Aiwan \ (•◡•) / _bot
ты папку bin вообще открывал в clang'е?
Faike
Я просто открывал консоль и выставлял флаги компиляции указывая какой файл компилировать в exe
Faike
Кто может подсказать, где в коде ошибка? format PE64 console entry start section '.data' data readable writeable message db 'Привет, FASM!', 0ah, 0 msglen equ $ - message hConsole dq ? bytesWritten dd ? section '.code' code readable executable start: mov ecx, -11 call [GetStdHandle] mov [hConsole], rax mov rcx, [hConsole] lea rdx, [message] mov r8d, msglen lea r9, [bytesWritten] sub rsp, 48 mov qword [rsp+32], 0 call [WriteConsoleA] add rsp, 48 mov ecx, 0 call [ExitProcess] section '.idata' import data readable library kernel32,'kernel32.dll',\ import kernel32 ExitProcess,'ExitProcess',\ import kernel32 GetStdHandle,'GetStdHandle',\ import kernel32 WriteConsoleA,'WriteConsoleA'
Faike
Инклудить? Или мб есть способ без него сделать?
Alexey
А что делать?
format PE64 console entry start include 'win64a.inc' section '.data' data readable writeable message db '??????, FASM!', 0ah, 0 msglen equ $ - message hConsole dq ? bytesWritten dd ? section '.code' code readable executable start: mov ecx, -11 call [GetStdHandle] mov [hConsole], rax mov rcx, [hConsole] lea rdx, [message] mov r8d, msglen lea r9, [bytesWritten] sub rsp, 48 mov qword [rsp+32], 0 call [WriteConsoleA] add rsp, 48 mov ecx, 0 call [ExitProcess] section '.idata' import data readable library kernel32,'kernel32.dll' import kernel32,\ ExitProcess,'ExitProcess' ,\ GetStdHandle,'GetStdHandle' ,\ WriteConsoleA,'WriteConsoleA'
Alexey
Инклудить? Или мб есть способ без него сделать?
в папке с fasm будут примеры и там PE64DEMO
Faike
Ругается
Alexey
Ругается
хехе он у тебя сверху вывел на самом деле сообщение, надо консоль вверх крутануть
Alexey
Ругается
Ну там много ошибок еще, как минимум не выровнен стек
Faike
Понял
Alexey
format PE64 console entry start include 'win64a.inc' section '.data' data readable writeable message db '??????, FASM!', 0ah, 0 msglen equ $ - message hConsole dq ? bytesWritten dd ? section '.code' code readable executable start: mov ecx, -11 call [GetStdHandle] mov [hConsole], rax mov rcx, [hConsole] lea rdx, [message] mov r8d, msglen lea r9, [bytesWritten] sub rsp, 48 mov qword [rsp+32], 0 call [WriteConsoleA] add rsp, 48 mov ecx, 0 call [ExitProcess] section '.idata' import data readable library kernel32,'kernel32.dll' import kernel32,\ ExitProcess,'ExitProcess' ,\ GetStdHandle,'GetStdHandle' ,\ WriteConsoleA,'WriteConsoleA'
format PE64 console entry start include 'win64a.inc' section '.data' data readable writeable message db 'Hello! FASM', 0 sizeof.message = $ - message bytesWritten dd ? section '.code' code readable executable start: sub rsp, 0x28 mov rcx, -11 call qword[GetStdHandle] mov rcx, rax lea rdx, qword[message] mov r8, sizeof.message lea r9, qword[bytesWritten] call qword[WriteConsole] mov rcx, 0 call qword[ExitProcess] and rsp, -16 section '.idata' import readable library kernel32,'kernel32.dll' import kernel32,\ ExitProcess,'ExitProcess' ,\ GetStdHandle,'GetStdHandle' ,\ WriteConsole,'WriteConsoleA'
Alexey
fastcall. Первые 4 аргумента в регистрах, остальные в стеке. Целые числа - rcx, rdx, r8, r9, плавающая точка - xmm0, xmm1, xmm2, xmm3. Вызов по порядку, т.е. для функции с сигнатурой func(int, double, double, int, int) Первый аргумент будет в rcx, второй xmm1, потом xmm2, потом r9, потом стек. Для функции в стеке надо выделять при вызове как минимум 32 байта в стеке, при этом он должен быть выровнен по границе 16 байт. Возврат целых значений через rax, плавающая точка через xmm0
Alexey
Alexey
Тут пропал пятый аргумент WriteConsole.
format PE64 console entry start include 'win64a.inc' section '.data' data readable writeable message db 'Hello, World!', 0xA, 'Hello, FASM!', 0 sizeof.message = $ - message bytesWritten dq ? section '.code' code readable executable start: sub rsp, 0x28 mov rcx, -11 call qword[GetStdHandle] mov rcx, rax lea rdx, qword[message] mov r8, sizeof.message lea r9, qword[bytesWritten] mov qword[rsp+0x20], 0 call qword[WriteConsole] ;invoke WriteConsole, rax, message, sizeof.message, bytesWritten, 0 mov rcx, 0 call qword[ExitProcess] add rsp, -16 section '.idata' import readable library kernel32,'kernel32.dll' import kernel32,\ ExitProcess,'ExitProcess' ,\ GetStdHandle,'GetStdHandle' ,\ WriteConsole,'WriteConsoleA'
s54820
Alexey
Faike
Хмм. Попробовал с помощью gpt-o3.mini переделать игру с c++ под fasm. И что-то пошло не так
aschensekt
Начнем с того что о3-мини это калечная модель, которая буквально вышла сырой
Faike
Ошибка в коде именно в той же строке. Но import kernel32 на этот раз не помогло
Faike
Начнем с того что о3-мини это калечная модель, которая буквально вышла сырой
Это единственная модель которая хотябы постаралась это сделать. Остальные берут пишут программу которая ничего не делает и говорят мне мол "во, держи, я сделал"
aschensekt
А о3 просто слишком глупая, чтобы это сказать
Faike
Вот тут вот ошибка возникает format PE64 console entry main ;──────────────────────────────────────────────────────────── ; Импорт функций из kernel32.dll и user32.dll ;──────────────────────────────────────────────────────────── section '.idata' import data readable writeable library kernel32, 'kernel32.dll',\ ExitProcess, 'ExitProcess',\ Sleep, 'Sleep',\ GetTickCount, 'GetTickCount',\ GetStdHandle, 'GetStdHandle',\ WriteConsoleOutputA, 'WriteConsoleOutputA',\ SetConsoleCursorInfo, 'SetConsoleCursorInfo' library user32, 'user32.dll',\ GetAsyncKeyState, 'GetAsyncKeyState'
Faike
Это чат гпт писал?
Это только часть кода. И да, gpt это написал
Alexey
Ну секция импорта у меня иначе выглядит
Там вот import какой-то появляется
Faike
А оно только ридебл быть может?