x86_64汇编中add [rax],al指令含义及对应助记符类型问询
关于
add [rax],al指令的逆向分析疑问解答 1. 助记符与Opcode对应关系
你看到的00 00 opcode对应的是**add m8, r8**类型的助记符,而非你猜测的add m64,r8。核心是操作数宽度:
al是8位寄存器(rax的低8位),因此指令操作宽度为8位[rax]此处指代rax指向地址的8位内存单元,内存操作宽度由寄存器操作数的位数决定,而非寄存器本身的64位宽度。00是add m8,r8的基础opcode,第二个字节00是ModR/M字节,解码后正好对应[rax]作为内存操作数、al作为寄存器操作数,完全匹配当前指令。
2. Ret后出现且断点未触发的原因
这类ret指令后的指令属于垃圾填充指令,大概率是代码混淆或内存对齐的手段:
- 程序执行
ret后会直接跳转到调用者的返回地址,不会执行ret之后的任何指令,因此这些add [rax],al永远不会被执行,断点自然无法触发。 - 这类指令的作用通常是干扰逆向分析流程,或者让函数结束地址对齐到特定字节边界(比如16字节)。
3. 指令的实际作用(若被执行)
如果这条指令被执行,它会将al中的8位数值加到rax指向地址的8位内存数据中,再将结果写回该内存单元。但在你的场景中,ret已经转移了执行流程,所以这条指令没有实际作用。
内容的提问来源于stack exchange,提问作者hexman100
相关产品推荐
相关产品推荐

