Eugene
А на каких языках?
На Виндоусе же! :)
Anonymous
По сути одно и то же.
Однако такой вопрос. Они подойдут мне, если я до этого не кодил на ассемблере?
­
Да
Тогда будет по крайней мере реально.
Eugene
Всем привет. Посоветуйте, пожалуйста, материалы по изучению ассемблера и связанных с ним тем, новичку с использованием gas
Нюанс в том, что здесь нет описания инструкций какого-либо процессора. Тут именно описание синтаксиса, директив, макрокоманд и т.п. Поэтому нужно вооружиться ещё каким-то учебникам, именно по инструкциям. Хотя бы маном fasm или учебником каким-то.
Nikita
https://sourceware.org/binutils/docs/as/
Евгений, спасибо за ссылки! А нет ли материалов специально по 64-разрядному ассемблеру для Windows?
­
Евгений, спасибо за ссылки! А нет ли материалов специально по 64-разрядному ассемблеру для Windows?
Я бы советовал вначале с 32-хбитным разобраться, так как 64 растёт из 32.
Nikita
Я на 32 уже несколько лет писал. Мы пишем на ассемблере вспомогательный софт. Основной на С++. Поскольку начали писать на C++ для 64, то ассемблер нужен теперь 64.
Eugene
Я на 32 уже несколько лет писал. Мы пишем на ассемблере вспомогательный софт. Основной на С++. Поскольку начали писать на C++ для 64, то ассемблер нужен теперь 64.
Полезно будет почитать это: 1. https://www.cyberforum.ru/assembler-x64/thread1190788.html 2. https://www.cyberforum.ru/assembler-x64/thread1328915.html 3. https://www.cyberforum.ru/assembler-x64/thread1675046.html 4. https://wasm.in/threads/skazki-djadjushki-rimusa-o-x64.31832/
Nikita
Евгений, огромное спасибо!
Sergey Boogerwooger
Тут недавно была дискуссия, рекомендовать ли студентам изучать асм, типа говорят "нахуа он сейчас". Вообще, если, кто не знал, то в блокчейнах дохрена низкоуровневой логики, и смарт-контракты - это куда ближе к асму, чем к высокоуровневым языкам (я про нормальные блокчейны, а не скамину где "у нас контракты на жабаскрипте"). И нормально писать и аудировать не понимая, как работает стек, как делать очень оптимизированные алгоритмы, чего стоит каждая инструкция виртуальной машины можно, но до топа не добраться. Так что учите асм нормально, даже если это микроконтролллер в универе - реально пригодится, да в высоконагруженных системах эти знания ппц нелишние
Marsel
Пацаны почему флешка форматнутая в exfat текстовые файлы с инфой превращает в null? (если на неё скинуть текстовый файл с инфой а потом открыть в блокноте из флешки) это флешка говно или с форматом что то не так ? Винд10 флешка Micro sd
Sergey Boogerwooger
При чём тут ассемблер?
Если сделать системный вызов open(на запись), потом не сделать write, а потом close, получится пустой файл.
Sergey Boogerwooger
А при чем амсемблер - я хз
Aiwan \ (•◡•) / _bot
так ты файл прграмно создаешь или через проводник копируешь на флешку?
Anonymous
Anonymous
2022, hex -> dec
Откуда инфа?
­
Откуда инфа?
А ты сам переведи.
Vovo4ka
С Новым 0b10000000100010 годом!!!
Eugene
Хай ол! 👋 ЧЯДНТ? NASM: bits 64 global tst section .bss dat resq 100 section .text tst: mov rax,[dat] ret CPP: extern "C" void tst(); int main() { tst(); } BAT: nasm.exe -f win64 a.asm -o a.o g++ -s -m64 a.cpp a.o -o a.exe Результат: a.o:a.asm:(.text+0x4): relocation truncated to fit: IMAGE_REL_AMD64_ADDR32 against `.bss' collect2.exe: error: ld returned 1 exit status
Eugene
Решил вопрос :) mov rax,[qword dat] работает нормально :)) Но ощущение, что можно как-то красивее сделать, через ключи NASM, например.
Eugene
А вот на mov rax,[qword dat + rdx] уже NASM ругается: a.asm:9: error: invalid effective address 🤦🏻‍♂️🤦🏻‍♂️🤦🏻‍♂️ Значит, надо как-то линкеру объяснить как с этим работать...
George
Несколько вариантов:
Eugene
Пока сработало вот так: -Wl,--image-base=0x10000000
George
1. Убрать динамическую базу
George
2. Использовать относительную адресацию
George
Второй вариант универсальнее
George
Через rip
Eugene
Меня интересуют опции, каким образом это сделать. -fPIC не помогает, напрмиер.
George
Навскидку: lea rsi, [rel dat]
George
Т.е. одной опции зачастую недостаточно
Eugene
Навскидку: lea rsi, [rel dat]
В таком виде работает, а вот это уже нет: mov rax,[rel dat + rdx]
George
Тогда явным образом используй rip
George
Тогда явным образом используй rip
rel — это ключевое слово насма, а не часть опкода
George
Можно попробовать глобально задать: DEFAULT REL
George
Можно попробовать глобально задать: DEFAULT REL
Но у этого может быть побочка, надо тестить
Eugene
rel — это ключевое слово насма, а не часть опкода
Я понимаю, но как его юзать в данном случае? Слова rip nasm не знает.
George
Это где задаётся?
В начале сорса
George
Типа глобального конфига
Eugene
В начале сорса
Не, в случае с регистром не пашет.
Eugene
Попробуй так: lea rax,[rip+(dat+rdx)]
Не знает он слова rip.
Eugene
Вообще говоря, 64-битная абсолютная адресация не работает в случае с регистрами.
Eugene
2. Использовать относительную адресацию
Мне кажется, наоборот нужна абсолютная, нет?
George
Ошибка, которая у тебя была явно связана с релоками
George
И решение с заданием жёсткой базы образа избавляет от ошибки
Eugene
Ну вот я и решил вопрос через -Wl,--image-base=0x10000000
George
Мне кажется, наоборот нужна абсолютная, нет?
Нет, либо ты везде используешь релоки; либо задаёшь жёстко базу; либо ты используешь относительную адресацию
George
В таком виде работает, а вот это уже нет: mov rax,[rel dat + rdx]
Оно в таком виде и не должно работать. Обрати внимание, что я использую lea, а ты используешь mov. Правильный вариант: lea rsi, [rel dat+rdx]
George
Ну или как у тебя, через rax: lea rax, [rel dat+rdx]
George
Можешь тут проверить: section .data msg db "Skip Hello world!", 0ah SKIP_CHARS equ 5 section .text global _start _start: mov rax, 1 mov rdi, 1 mov rdx, SKIP_CHARS ;lea rsi, [rel msg] ; String as is lea rsi, [rel msg+rdx] ; String with skipped chars mov rdx, 13 syscall mov rax, 60 mov rdi, 0 syscall
Eugene
Оно в таком виде и не должно работать. Обрати внимание, что я использую lea, а ты используешь mov. Правильный вариант: lea rsi, [rel dat+rdx]
Разницы нет: mov или lea, обе инструкции принимают одни и те же операнды. Если mov не линкуется, то и lea не будет (и не линкуется, собственно, я даже попробовал для прикола).
Eugene
По крайней мере, при тех же ключах компиляции.
Eugene
/usr/bin/ld: b.o: relocation R_X86_64_32S against `.data' can not be used when making a PIE object; recompile with -fPIE collect2: error: ld returned 1 exit status Ключ -fPIE никак не помогает.
Eugene
Не знаю, как они там компилят такой код, с какими ключами...
Eugene
Я делаю так (через WSL): wsl gcc -s -nostdlib -fpie b.o
George
Сохранил пример: https://www.mycompiler.io/view/65J1m94
Ты этот код проверял в браузере? Не работает?
Eugene
Нет, либо ты везде используешь релоки; либо задаёшь жёстко базу; либо ты используешь относительную адресацию
Если я задаю жёстко базу (в нужном диапазоне), то смещения не будут превышать 32 бита. Относительную адресацию я могу использовать так: mov rax,[rel dat] mov rax,[rax+rdx] А вот с релоками не очень понятно. По идее они должны перезаписывать 8-байтный адрес. Но почему не работает вот это? mov rax,[abs dat] mov rax,[rax+rdx] По идее он должен релоком скорректировать первую инструкцию.
Eugene
Ты этот код проверял в браузере? Не работает?
При чём тут браузер? Если я задам ключ -Wl,--image-base=0x10000000, то и mov rax,[dat+rdx] будет работать. Я ж не знаю, как на сервере этот код компилится. А ты знаешь?
Eugene
Я в реале не могу этот код скомпилить. А ты можешь? Без ключа -Wl,--image-base=0x10000000
Eugene
В браузере я могу и такой код скомпилить: https://www.mycompiler.io/view/8PvfldV
Eugene
Как они его компилят? С какими ключами?
George
Можно попробовать в другом онлайн инструменте
George
Я с телефона, поэтому чистый nasm протестировать пока не могу
Eugene
Мне с релоками не понятен момент.