Faike
Ещё одна ошибка...
Faike
Ещё одна ошибка...
Интересно теперь из-за чего она. Это ведь просто арифметическое выражение
Aiwan \ (•◡•) / _bot
Рената🐾
Я хочу изучать системную разработку но не хочу бросать инфобез
Ну я совмещаю( В свободное время изучаю программирование bare-metal. Основное - образование, учеба в универе. Иногда в ctf и тп участвую. Но надо понимать, что я не работаю пока, поэтому с этим легче. Расставляй приоритеты. Я спокойно могу пожертвовать время от учебы на то, что мне будет полезнее или интереснее. Расслабься)
SANEK_ALEXANDR
Постараюсь
SANEK_ALEXANDR
SANEK_ALEXANDR
SANEK_ALEXANDR
Вопрос в настоящее время есть ли сейчас более лёгкий и современный аналог GDB ?
Ivan
Проблема была в неправильном импорте библиотек и функций из них. Спасибо GPT за это
я думал сам догадаешься ведь в ошибке так и было написано =)
Faike
я думал сам догадаешься ведь в ошибке так и было написано =)
Для того чтобы догадаться я пошёл смотреть гайды по fasm с нуля. Там было то как это делается и я понял в чём ошибка
Aiwan \ (•◡•) / _bot
ложь, выдумка ИИ.
Faike
resb — это стандартная FASM-директива для резервирования определённого числа байт (bytes) в BSS-секции. В 64-битном режиме она точно так же поддерживается, как и в 32-битном. Зачем вообще нужен resb? BSS (Block Started by Symbol) — это секция, в которой не хранятся инициализированные данные, а просто резервируется место в памяти при загрузке программы. Директивы вида resb, resw, resd, resq и т.п. в FASM (и MASM/YASM/NASM с похожим синтаксисом) — это способ сказать «в этой секции нужно зарезервировать N байт (или слов, или двойных слов и т.д.)». При этом в самом исполняемом файле никакие байты не занимают места (или занимают минимальный overhead), т.к. они не инициализированы заранее. Альтернативы resw, resd, resq Отличаются размером единицы резервирования: resw (word, 2 байта), resd (dword, 4 байта), resq (qword, 8 байт). Если, например, хочется зарезервировать 1000 64-битных чисел, можно написать resq 1000. Определять данные прямо в .data Например, times 50000 db 0. Но тогда все 50000 байт войдут в итоговый файл и при загрузке ОС скопирует их в память. Обычно для больших буферов это нежелательно. Выделять память динамически В 64-битном коде под Windows можно вызвать VirtualAlloc, под Linux — mmap, под любой POSIX — malloc (через вызовы стандартной библиотеки C), и т.д. Это может быть удобнее, если размер памяти меняется во время выполнения или очень велик. Когда лучше использовать resb? Если нужно просто зарезервировать относительно небольшой буфер в статической памяти (несколько десятков килобайт, сотни килобайт и т.д.), resb отлично подходит. Если размер может быть очень большим (мегабайты и больше) или меняется во время работы программы, лучше перейти на динамическое выделение (через VirtualAlloc, mmap или другую системную функцию). Итого, resb вполне нормальная и стандартная директива как в 32-битном, так и в 64-битном ассемблерном коде на FASM. Если нет особых причин (например, нужен динамический размер или очень большие объёмы памяти), то нет необходимости «использовать что-то другое» — resb подойдёт
Faike
resb — это стандартная FASM-директива для резервирования определённого числа байт (bytes) в BSS-секции. В 64-битном режиме она точно так же поддерживается, как и в 32-битном. Зачем вообще нужен resb? BSS (Block Started by Symbol) — это секция, в которой не хранятся инициализированные данные, а просто резервируется место в памяти при загрузке программы. Директивы вида resb, resw, resd, resq и т.п. в FASM (и MASM/YASM/NASM с похожим синтаксисом) — это способ сказать «в этой секции нужно зарезервировать N байт (или слов, или двойных слов и т.д.)». При этом в самом исполняемом файле никакие байты не занимают места (или занимают минимальный overhead), т.к. они не инициализированы заранее. Альтернативы resw, resd, resq Отличаются размером единицы резервирования: resw (word, 2 байта), resd (dword, 4 байта), resq (qword, 8 байт). Если, например, хочется зарезервировать 1000 64-битных чисел, можно написать resq 1000. Определять данные прямо в .data Например, times 50000 db 0. Но тогда все 50000 байт войдут в итоговый файл и при загрузке ОС скопирует их в память. Обычно для больших буферов это нежелательно. Выделять память динамически В 64-битном коде под Windows можно вызвать VirtualAlloc, под Linux — mmap, под любой POSIX — malloc (через вызовы стандартной библиотеки C), и т.д. Это может быть удобнее, если размер памяти меняется во время выполнения или очень велик. Когда лучше использовать resb? Если нужно просто зарезервировать относительно небольшой буфер в статической памяти (несколько десятков килобайт, сотни килобайт и т.д.), resb отлично подходит. Если размер может быть очень большим (мегабайты и больше) или меняется во время работы программы, лучше перейти на динамическое выделение (через VirtualAlloc, mmap или другую системную функцию). Итого, resb вполне нормальная и стандартная директива как в 32-битном, так и в 64-битном ассемблерном коде на FASM. Если нет особых причин (например, нужен динамический размер или очень большие объёмы памяти), то нет необходимости «использовать что-то другое» — resb подойдёт
Это от gpt
Faike
Почему все гайды на fasm обязательно используют 32бит ассемблер?
Faike
32бит же уже давно померло
Сармат
32бит же уже давно померло
Ассемблер же уже давно помер😁
Mikhail
32бит же уже давно померло
Ну если ты говоришь о ПК и привычных серверных решениях, то да, но вообще используются и 16 битный PDP-11 до сих пор)
Aiwan \ (•◡•) / _bot
resb — это стандартная FASM-директива для резервирования определённого числа байт (bytes) в BSS-секции. В 64-битном режиме она точно так же поддерживается, как и в 32-битном. Зачем вообще нужен resb? BSS (Block Started by Symbol) — это секция, в которой не хранятся инициализированные данные, а просто резервируется место в памяти при загрузке программы. Директивы вида resb, resw, resd, resq и т.п. в FASM (и MASM/YASM/NASM с похожим синтаксисом) — это способ сказать «в этой секции нужно зарезервировать N байт (или слов, или двойных слов и т.д.)». При этом в самом исполняемом файле никакие байты не занимают места (или занимают минимальный overhead), т.к. они не инициализированы заранее. Альтернативы resw, resd, resq Отличаются размером единицы резервирования: resw (word, 2 байта), resd (dword, 4 байта), resq (qword, 8 байт). Если, например, хочется зарезервировать 1000 64-битных чисел, можно написать resq 1000. Определять данные прямо в .data Например, times 50000 db 0. Но тогда все 50000 байт войдут в итоговый файл и при загрузке ОС скопирует их в память. Обычно для больших буферов это нежелательно. Выделять память динамически В 64-битном коде под Windows можно вызвать VirtualAlloc, под Linux — mmap, под любой POSIX — malloc (через вызовы стандартной библиотеки C), и т.д. Это может быть удобнее, если размер памяти меняется во время выполнения или очень велик. Когда лучше использовать resb? Если нужно просто зарезервировать относительно небольшой буфер в статической памяти (несколько десятков килобайт, сотни килобайт и т.д.), resb отлично подходит. Если размер может быть очень большим (мегабайты и больше) или меняется во время работы программы, лучше перейти на динамическое выделение (через VirtualAlloc, mmap или другую системную функцию). Итого, resb вполне нормальная и стандартная директива как в 32-битном, так и в 64-битном ассемблерном коде на FASM. Если нет особых причин (например, нужен динамический размер или очень большие объёмы памяти), то нет необходимости «использовать что-то другое» — resb подойдёт
чушь
aschensekt
https://www.cyberforum.ru/assembler/thread562956.html
Aiwan \ (•◡•) / _bot
https://www.cyberforum.ru/assembler/thread562956.html
вот тут уже есть правильные слова. но сам вопрос не имеет смысла
Alexey
32бит же уже давно померло
Steam на 32 битах работает
Faike
А почему скомпилированные экземплы х32 fasm тоже работают на моем компе?
Alexey
Для обеспечения обратной совместимости winAPI 32 битный находится в папке sysWOW64 (из папки Windows). 64 бит - это стандартный winAPI, который находится в System32, он отличается SSE расширениями, однако выполняет тот же функционал другими методами Возможности windows одинаковые и лежат в kernel32.dll, которая содержит в себе основной функционал windows и является частью winAPI
aschensekt
Это не экземплы, а экзешники
Я подозреваю, речь как раз про экземплы
Faike
Это не экземплы, а экзешники
EXAMPLE папка называется и в ней экземплы кода
Faike
Но меня просто смущает что на x64 работают х32 регистры
Faike
eax и прочие
Alexey
EXAMPLE папка называется и в ней экземплы кода
Ну по тому же самому принципу
Alexey
Ну по тому же самому принципу
В экземплах у тебя же экзешники?
Alexey
В экземплах у тебя же экзешники?
Кроме того, где dll делает
Alexey
Кроме того, где dll делает
Но там тоже самое
Faike
Экзешники это уже готовые файлы. И это тупо
Faike
Когда нужен не готовый файл а пример написания кода. Так что это экземплы
Сармат
Но меня просто смущает что на x64 работают х32 регистры
Твоё представление крайне ошибочно...
Mikhail
Но меня просто смущает что на x64 работают х32 регистры
На самом деле больше смущало, если бы не работали)
Alexey
Rax/eax/ax который на ah/al
Faike
Хм, интересно
Faike
А используя код для более старых архитектур можно ли получить большую производительность с меньшим потреблением памяти и меньшим весом бинарника?
Alexey
А используя код для более старых архитектур можно ли получить большую производительность с меньшим потреблением памяти и меньшим весом бинарника?
Разницы нет, что на старой, что на новой - пока она полностью совместимая, то она не считается устаревшей
Alexey
А используя код для более старых архитектур можно ли получить большую производительность с меньшим потреблением памяти и меньшим весом бинарника?
Как раз наоборот в х86-64 можно все сделать быстрее, обращение к памяти процесса(регистрам) быстрее, чем к любой другой. Регистров х86-64 намного больше, чем х86
Faike
Как раз наоборот в х86-64 можно все сделать быстрее, обращение к памяти процесса(регистрам) быстрее, чем к любой другой. Регистров х86-64 намного больше, чем х86
Я имел ввиду, если ориентироваться на ограничения старых процессоров, ибо я не планирую писать что-то крутое 3дшное современное на нем, иначе я бы взял готовый движок
SANEK_ALEXANDR
Возьми готовый
Faike
Возьми готовый
ибо я не планирую писать что-то крутое 3дшное современное на нем, иначе я бы взял готовый движок
Faike
Моя цель - менее 100кб
Faike
Минимальный бинарник даже c++ файла - 250кб
SANEK_ALEXANDR
Зачем такой размер?
SANEK_ALEXANDR
Это бред какой то
SANEK_ALEXANDR
Ассемблер такое себе удовольствие для гейм дева как по мне
Alexey
Моя цель - менее 100кб
На ассемблере трудно написать что-то выше 4кб
SANEK_ALEXANDR
Для какого именно?
Я могу предположить что ты пишешь инди проект так?
Faike
Да
SANEK_ALEXANDR
Ну так
SANEK_ALEXANDR
Используй питон руби или c
SANEK_ALEXANDR
Это будет банальный мозготрах если на ассемблере писать
Alexey
Да
Tempesta сделал игровой движок и 2д игру - на ютубе есть
SANEK_ALEXANDR
Типо Это осуществимо но зачем?
SANEK_ALEXANDR
Каждый дрочит как хочет
Я предлогаю менее ебучую альтернативу
Faike
Какова например твоя цель в использовании ассемблера? Всё ведь и так уже есть, всё готово. Твой вклад будет практически никаким
SANEK_ALEXANDR
Я не понимаю зачем тебе для разработки инди игры ассемблер это максимально низкоуровневый язык зачем
SANEK_ALEXANDR
Зачем тебе работа с процессором
SANEK_ALEXANDR
Зачем тебе взаимодействие с ram
SANEK_ALEXANDR
Для игровой разработки особенно инди очень хорошо подходит юнити
SANEK_ALEXANDR
Или ещё проще
SANEK_ALEXANDR
Есть движок game maker
SANEK_ALEXANDR
Он легче юнити
Faike
Игры могут быть более прикладной областью, чем написание своего загрузчика, который, скорее всего, никто не будет использовать. Я могу сделать что-то, что реально увидят другие люди и поиграют. При этом я буду так же иметь же опыт в том как работает компьютер на низком уровне