.macro alloc_linked_list_item_rdi_rax
movq $24, %rdi
call malloc@PLT
testq %rax, %rax
leaq 0x1a(%rip), %r10
jz *%r10 # <=
movq $0xA, 0x0(%rax) # void *data
movq $0x0, 0x8(%rax) # struct linked_list_item *prev
movq $0x0, 0x10(%rax) # struct linked_list_item *next
.endm
Когда я пытаюсь собрать следующий макрос (с GCC на GNU/Linux Debian x86-64), ассемблер выдает ll.s:86: Error: operand type mismatch for 'jz'
, где ll.s:86
указывает на внутри этого макроса, на этот конкретный jz
.
Для этого макроса я попытался использовать локальные метки для управления потоком управления, однако это вызвало ошибку, что у меня не может быть повторяющихся имен меток (поскольку я дважды использовал макрос в программе), и поэтому я переключился на прыжки с помощью расположение к RIP (рассчитывается с использованием objdump
и последующего подсчета длины инструкций).
Данная сборка работала, если бы я заменил jz
на безусловную jmp
, так как в связи с этим я не понимаю, почему написанный мной код не работает.
Может ли кто-нибудь пролить свет?