.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
, так как из-за этого я запутался, почему написанный мной код не работает.
Может ли кто-нибудь пролить свет?