Мікаель
он всё, что ему скормишь, рассматривает по-символьно; скармливаешь ему формальные параметры макроса и потом уже парсишь посимвольно (на первом проходе ищещь четные/нечетные кавычки)
Мікаель
кстати ещё одна подсказка, более простой способ (я им пользовался): параметры можно указывать без запятых, то есть через пробел
Мікаель
ну типа там 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
щас тебе люди будут советовать не использовать сишные функции, пиши мол все сам
Aiwan \ (•◡•) / _bot
Eugene
Может, вместо tasm использовать другой компилятор?
Vladimir
Anonymous
Anonymous
он же потом в нативный переводится
Anonymous
Anonymous
да, можно, сейчас
Anonymous
Vladimir
Eugene
Побайтно, стало быть?
Vladimir
в виде строк
Eugene
Неужели в откомпилированном виде строки будут?
Anonymous
я решил llvm ir попробовать, чтобы свой простенький компилятор написать
Eugene
Anonymous
Vladimir
Anonymous
аа
Anonymous
https://llvm.org/docs/LangRef.html#inline-assembler-expressions
JeisonWi
Кстати, radare2 умеет его дизасмить
Andrei
чуваки, подскажите, пожалуйста, что здесь происходит?
https://monosnap.com/file/9bd2MgMnN1KWxicbSRRnbsjR8v6KYz
скомпилил nasm’ом обычный хелло_ворлд, слинковал и сделал дизасм.
MacOS.
Andrei
И может немного не по теме, но если кто знает, подскажите еще такой момент:
как можно замерить влияние суперскалярности на производительность?
Есть ли тулзятины, которые помогают как-то трекать prefetching, out of order, superscalar, branch prediction и т.п. штуки (если не все перечислил:))
Aiwan \ (•◡•) / _bot
Andrei
нули - это nop?
Aiwan \ (•◡•) / _bot
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 (драйвер в комплекте).
Но разбираться придётся самому.
Andrei
Eugene
Но это если самому делать.
А готовые "тулзятины" — это профайлеры, собственно. Intel VTune Amplifier, к примеру.
Правда, вот не подскажу, может ли он давать такую подробную инфу. Не так много им пользовался, да и времени много прошло с последнего раза.
Eugene
Есть ещё Intel Architecture Code Analyzer (IACA).
Не знаю, насколько он будет по теме. Это статический анализатор кода. Как там branch misses протестить через него — х/з, но вероятно, что-то придумать можно :))
s54820
D'mi't'ri'y
#book
D'mi't'ri'y
Тяжело когда нету закладки с этим тегом. Приходится в поисковик каждый раз заходить.
Andrei
нули это 0000
а может в курсе, почему он мне 4к этих нулей забомбил?
Aiwan \ (•◡•) / _bot
ещё возможно при вырпвнивании кода, данных компиль может нулями заполнить промнжуток
Andrei
Aiwan \ (•◡•) / _bot
но скорей всего то что ты показываешь это не код а данные, имхо
Eugene
При выделении память обнуляется: https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc
s54820
Eugene
Memory allocated by this function is automatically initialized to zero.
Eugene
Пастбин не смотрел пока.
Eugene
Andrei
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
В любом случае спасибо; откуда это идёт разобрался.
А если кто допрет, почему на диске лежит этот пэйджзеро и поделится, тоже буду благодарен