bomb lab phase_2汇编指定指令含义与执行结果技术问询
phase_2 目标汇编指令语义解析
前置上下文说明
要理解这两条指令的作用,得先结合整个函数的执行流看寄存器和内存布局的前置状态:
- 调用
read_six_numbers后,用户输入的6个32位int会被连续存储在栈内存上,从%rsp指向的地址开始,每个元素占4字节,内存布局对应:input[0]存放在(%rsp)地址input[1]存放在0x4(%rsp)地址input[2]存放在0x8(%rsp)地址- 后续元素依次向后偏移4字节,直到
input[5]存放在0x18(%rsp)地址
- 进入循环逻辑前,程序会做两个寄存器初始化:
- 执行
lea 0x8(%rsp),%rbx:把rbx设为input[2]的内存地址 - 执行
lea 0x18(%rsp),%rbp:把rbp设为循环边界,即数组最后一个元素的下一个地址,用于判断循环是否结束
- 执行
目标指令逐行拆解
指令1:mov -0x8(%rbx),%eax
- 内存寻址规则:x86-64的
偏移(%基址寄存器)寻址模式,实际访问的内存地址为%rbx - 0x8 - 结合rbx初始值计算:第一次进入循环时,该地址等于
&input[2] - 0x8 = &input[0] - 执行动作:从该地址读取一个32位整数,写入
%eax寄存器。因为%eax是64位寄存器%rax的低32位,写入时会自动将%rax的高32位清零。 - 第一次循环的实际效果:把用户输入的第一个数(
input[0])加载到eax中。
指令2:add -0x4(%rbx),%eax
- 内存寻址规则:实际访问的内存地址为
%rbx - 0x4 - 结合rbx初始值计算:第一次进入循环时,该地址等于
&input[2] - 0x4 = &input[1] - 执行动作:从该地址读取32位整数值,累加到当前
%eax的结果上。 - 接上例的实际效果:第一次循环执行完后,
%eax = input[0] + input[1]。
指令组合的完整校验逻辑
这两条指令的计算结果会直接传给紧邻的下一条指令cmp %eax,(%rbx),也就是把刚才算出来的和值,和当前rbx指向的内存里存储的数做相等性校验:
- 第一次循环rbx指向
input[2],校验规则为input[2] == input[0] + input[1],不等就触发爆炸函数 - 每轮循环末尾会执行
add $0x4,%rbx将rbx指向下一个数组元素,此时寻址的偏移值会自动跟上位置变化:- 第二轮循环rbx指向
input[3]:-0x8(%rbx)对应&input[1],-0x4(%rbx)对应&input[2],校验规则变为input[3] == input[1] + input[2] - 后续循环依次校验
input[4] == input[2]+input[3]、input[5] == input[3]+input[4]
- 第二轮循环rbx指向
- 结合函数开头强制校验
input[0]==0、input[1]==1的前置要求,整个phase_2要求的正确输入就是固定前两项的斐波那契序列:0 1 1 2 3 5
内容的提问来源于stack exchange,提问作者Beginner Programmer
相关产品推荐
相关产品推荐

