Патч для GNU Assembler (конкретно для текущего пакета binutils-gdb)
Добавлены новые макро директивы:
.ifbin - check for digit in binary format (base 2)
.ifconst - check for constant or abs value
.ifdec - check for digit (base 10)
.iffloat - check for floating digit
.ifhex - check for hex digit (base 16)
.ifnumber - check for digit in format: bin, dec, float, hex
.ifquoted - check for string quoted by \" (not digits!)
Использование:
.macro INVOKE fn:req, rdi, rsi, rdx, rcx
.ifnb "\rdi\()"
.ifquoted "\rdi\()"
.warning "STRING: \rdi\()"
.section .rodata
.internal tmp_string_rdi_\@
tmp_string_rdi_\@: .string "\rdi\()"
.section .text
/* movabsq $tmp_string_rdi_\@, %rdi */
.else
.warning "ANOTHER: \rdi\()"
/* movabsq \rdi\(), %rdi *
.endif
.endif
/* callq \fn */
.endm
ЗАМЕЧАНИЯ:
если вызвать два раза сподряд с одинаковыми строковыми параметрами, то выдаст ошибку (не знаю как лечится, скорее тут проблема лежит глубже, на уровне парсинга исходников и построения AST):
INVOKE Println, "hello\n"
INVOKE Println, "hello\n"