汇编执行顺序疑问:print_hex内未显式调用的iterate为何会执行?
汇编标签执行逻辑问题解答
1. iterate标签被执行的原因
你对汇编标签的作用存在误解,首先明确核心规则:
- 汇编里的标签只是对应内存地址的别名,不存在「只有被
call才会执行」的限制。CPU完全按照指令指针寄存器rip的取值执行指令,只要rip的值指向标签对应的内存地址,就会执行标签后续的指令,和是否被call无关。 print_hex和iterate是两个相邻的标签,两个标签之间没有任何改变执行流的指令(跳转、返回、系统调用等),执行流会自然向下流动:- 当
call print_hex触发后,rip指向print_hex标签地址,依次执行下面四条指令:mov rax, rdi mov rdi, 1 mov rdx, 1 mov rcx, 64 - 四条指令执行完成后,
rip会自动移动到下一条指令的地址,这个地址恰好就是iterate标签标记的地址,所以直接进入iterate对应的代码段执行,不需要额外的调用逻辑。
- 当
- 后续
iterate段末尾的jnz iterate指令,会在rcx不为0时直接修改rip的值为iterate的地址,实现循环执行的效果,本质就是print_hex内部的循环体。
2. strlen中.loop标签的执行逻辑
.loop是NASM语法里的局部标签,作用域属于前面最近的非局部标签(也就是strlen),完全属于strlen的一部分。
它的执行逻辑和iterate完全一致:strlen标签后的初始化指令执行完成后,没有改变执行流的指令,会自然顺序向下进入.loop对应的代码段执行,同时.loop末尾通常会有跳转指令跳回自身实现循环,是strlen的内部逻辑组成部分。
内容的提问来源于stack exchange,提问作者Thang Nguyen
相关产品推荐
相关产品推荐

