Мікаель
он всё, что ему скормишь, рассматривает по-символьно; скармливаешь ему формальные параметры макроса и потом уже парсишь посимвольно (на первом проходе ищещь четные/нечетные кавычки)
Мікаель
кстати ещё одна подсказка, более простой способ (я им пользовался): параметры можно указывать без запятых, то есть через пробел
Мікаель
ну типа там mymacro r7 18+5 9 78
Мікаель
эквивалентно ну типа там mymacro r7,18+5,9,78
Мікаель
можно попробовать сочинить маймакро "ура за родину" — получишь три фактических параметра
Мікаель
это конечно не совсем полноценно, например, 12+7 внутри эрзац-строки скомпилируется в 19
Dmitrij
Михаил, спасибо огромное ! такой вот вариант работает:
Dmitrij
.macro TEST_STRING s .irpc p,"\s" .if \p == '"' .warning "OOOOOOOOOOOKKKKKKKKKKKKKKKK !!!!!!! \s\()" # определить внутреннюю переменную сигнализирующую ковычки .exitm .endif .endr .endm;
Мікаель
на здоровье )
Dmitrij
время будет свободное, я всё таки попробую запилить директиву .ifquoted в AS, может что и получится ))
Dmitrij
см. в сторону макроса .irpc
Михаил, директива .irpc в том макросе что я скидывал, отрабатывает один раз. Если вызвать макрос повторно выдаёт ошибку: "Ошибка: символ «.if» уже определён". Есть какие-нибудь соображения как вылечить ?
Мікаель
буду за компом, скину
Dmitrij
буду за компом, скину
Михаил, уже не нужно, запилил макро директиву .ifquoted: https://sourceware.org/ml/binutils/2020-01/msg00292.html
Андрей
драсте
Anonymous
Подскажите, как разрешить конфликт имён в Tasm? Есть импортируемая и экспортируемая функция с одинаковым именем: EXTRN sprintf:proc И PUBLICDLL sprintf. Tasm ругается, что имена совпадают и не дают откомпилировать программу. Пока решаю задачу так: эксортируемая функция идет под другим именем и далее приходится патчить исполняемый код.
Aiwan \ (•◡•) / _bot
щас тебе люди будут советовать не использовать сишные функции, пиши мол все сам
Anonymous
щас тебе люди будут советовать не использовать сишные функции, пиши мол все сам
Пишется интерцептор dll, а она импортирует и экспортирует одну и ту же функцию
Eugene
Может, вместо tasm использовать другой компилятор?
s54820
Может, вместо tasm использовать другой компилятор?
Присоединяюсь. Но вообще, наверное, можно .def написать, и там в exports переименовать. Тасм ведь умеет .def?
Anonymous
Может, вместо tasm использовать другой компилятор?
кто-то ещё теребит старичка? я вот LLVM IR щупаю, немного непонятный, нет проблем с регистрами
Anonymous
он же потом в нативный переводится
Vladimir
он же потом в нативный переводится
Ну да, бекендом. А вот как туда асмовставки нативные пихаются?
Anonymous
Ну да, бекендом. А вот как туда асмовставки нативные пихаются?
ты имеешь в виду "пользовательские"?
Vladimir
ты имеешь в виду "пользовательские"?
Ну да, всякие __asm("mov %1,%%es"::"a") и т п
Anonymous
да, можно, сейчас
Anonymous
Ну да, всякие __asm("mov %1,%%es"::"a") и т п
https://llvm.org/docs/LangRef.html#module-level-inline-assembly
Vladimir
https://llvm.org/docs/LangRef.html#module-level-inline-assembly
Ну то есть вообще "живьем" пробрасываются
Eugene
Побайтно, стало быть?
Vladimir
в виде строк
Eugene
Неужели в откомпилированном виде строки будут?
Anonymous
я решил llvm ir попробовать, чтобы свой простенький компилятор написать
Vladimir
Неужели в откомпилированном виде строки будут?
В ассемблерном коде всегда строки, ассемблер пережует в бинарь
Vladimir
я решил llvm ir попробовать, чтобы свой простенький компилятор написать
Все жду пока кто-нть наваяет бекенд к ebc. Один чувак пытался, но, походу забросил.
Vladimir
Так а в LLVM-бинаре что будет?
Судя по ссылке выше - строки.
Vladimir
ebc — это?
EFI bytecode
Anonymous
аа
Anonymous
https://llvm.org/docs/LangRef.html#inline-assembler-expressions
JeisonWi
EFI bytecode
Он помер же вроде
JeisonWi
Кстати, radare2 умеет его дизасмить
Andrei
чуваки, подскажите, пожалуйста, что здесь происходит? https://monosnap.com/file/9bd2MgMnN1KWxicbSRRnbsjR8v6KYz скомпилил nasm’ом обычный хелло_ворлд, слинковал и сделал дизасм. MacOS.
Andrei
И может немного не по теме, но если кто знает, подскажите еще такой момент: как можно замерить влияние суперскалярности на производительность? Есть ли тулзятины, которые помогают как-то трекать prefetching, out of order, superscalar, branch prediction и т.п. штуки (если не все перечислил:))
Andrei
Самому написать?
даже не знаю как подступиться. есть тематичские линки?
Andrei
нули - это nop?
Aiwan \ (•◡•) / _bot
нули - это nop?
нули это 0000
Andrei
а, понял спасибо
Aiwan \ (•◡•) / _bot
у nop код инстукции другой
Eugene
И может немного не по теме, но если кто знает, подскажите еще такой момент: как можно замерить влияние суперскалярности на производительность? Есть ли тулзятины, которые помогают как-то трекать prefetching, out of order, superscalar, branch prediction и т.п. штуки (если не все перечислил:))
Читай об инструкции rdpmc. Я её не использовал, просто знаю, что она есть и позволяет получать счётчики производительности (в т.ч. last-level cache misses, branch misses и пр). Короче, 18-я глава 3-го тома интеловского мана + описание инструкции во 2-м томе. Но это нетривиальная задача. Инструкция привилегированная, а значит придётся юзать драйвер. В качестве примера использования можно взять PMCTest Агнера Фога: https://www.agner.org/optimize/#testp (драйвер в комплекте). Но разбираться придётся самому.
Eugene
Но это если самому делать. А готовые "тулзятины" — это профайлеры, собственно. Intel VTune Amplifier, к примеру. Правда, вот не подскажу, может ли он давать такую подробную инфу. Не так много им пользовался, да и времени много прошло с последнего раза.
Eugene
Есть ещё Intel Architecture Code Analyzer (IACA). Не знаю, насколько он будет по теме. Это статический анализатор кода. Как там branch misses протестить через него — х/з, но вероятно, что-то придумать можно :))
D'mi't'ri'y
#book
D'mi't'ri'y
Тяжело когда нету закладки с этим тегом. Приходится в поисковик каждый раз заходить.
Andrei
нули это 0000
а может в курсе, почему он мне 4к этих нулей забомбил?
Eugene
а может в курсе, почему он мне 4к этих нулей забомбил?
Как можно нормально ответить на этот вопрос просто по скриншоту куска кода с нулями? Вообще, страница памяти обычно имеет размер 4кб.
Andrei
Как можно нормально ответить на этот вопрос просто по скриншоту куска кода с нулями? Вообще, страница памяти обычно имеет размер 4кб.
https://pastebin.com/SA1NrG9U если бы я знал как спросить, я бы спросил. у меня обычный “hello world” бинарь на ассемблере на диске. как это связано со страничной памятью? не понимаю. или это как-то связано с тем, что файлы в фс не хранятся размером меньше, чем 4кб?
Aiwan \ (•◡•) / _bot
а может в курсе, почему он мне 4к этих нулей забомбил?
винда при выделении памяти под секции программы (code data итд) видимо зануляет выделенные участки.
Aiwan \ (•◡•) / _bot
ещё возможно при вырпвнивании кода, данных компиль может нулями заполнить промнжуток
Aiwan \ (•◡•) / _bot
но скорей всего то что ты показываешь это не код а данные, имхо
Eugene
При выделении память обнуляется: https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc
s54820
но скорей всего то что ты показываешь это не код а данные, имхо
Там с офсета 28 написано __PAGEZERO. Это неспроста 😁
Eugene
Memory allocated by this function is automatically initialized to zero.
Eugene
Пастбин не смотрел пока.
s54820
Пастбин не смотрел пока.
Там в пастебине бинарник для мака, дизассемблированный как raw.
Andrei
меня смущает, что это лежит в бинаре
и пока я пришел к выводу, что это относится к заголовку mach-o
Eugene
меня смущает, что это лежит в бинаре
Это может лежать в бинаре, потому что, например, так код написан.
Eugene
Оригинального исходника нет?
Andrei
Оригинального исходника нет?
section .text global _start _start: mov rax, 0x02000004 mov rdi, 1 mov rsi, message mov rdx, 2 syscall mov rax, 0x02000001 xor rdi, rdi syscall section .data message: db "Hello, World", 10
Andrei
в спеке mach-o 1. The static linker creates a __PAGEZERO segment as the first segment of an executable file. This segment is located at virtual memory location zero and has no protection rights assigned, the combination of which causes accesses to NULL, a common C programming error, to immediately crash. The __PAGEZERO segment is the size of one full VM page for the current CPU architecture (for x86 and PowerPC, this is 4096 bytes or 0x1000 in hexadecimal). Because there is no data in the __PAGEZERO segment, it occupies no space in the file (the file size in the segment command is zero). Field Descriptions 2. vmsize Indicates the number of bytes of virtual memory occupied by this segment. See also the description of filesize, below. 3. filesize Indicates the number of bytes occupied by this segment on disk. For segments that require more memory at runtime than they do at build time, vmsize can be larger than filesize. For example, the __PAGEZERO segment generated by the linker for MH_EXECUTABLE files has a vmsize of 0x1000 but a filesize of zero. Because __PAGEZERO contains no data, there is no need for it to occupy any space until runtime. Also, the static linker often allocates uninitialized data at the end of the __DATA segment; in this case, the vmsize is larger than the filesize. The loader guarantees that any memory of this sort is initialized with zeros. если сделать: otool -lv app, там можно найти: segname __PAGEZERO vmaddr 0x0000000000000000 vmsize 0x0000000100000000 fileoff 0 filesize 0 Все логично, подходит по спеке. Размер файла на диске 12кб (ок, 3 pagesize’а) Сам размер файла 8300+ байт, если открывать средствами не какого-нибудь hexdump, а средствами с++ или саблаймом тем же. это при чтении файла fs распознает формат и отдает лишние 0? Нелогичено для меня, почему тогда размер на диске учитывает эти 0
Andrei
В любом случае спасибо; откуда это идёт разобрался. А если кто допрет, почему на диске лежит этот пэйджзеро и поделится, тоже буду благодарен