*** NoteId: 68889a33322d3157a2ae87f8 NotebookId: 5dc7990985a5152b37000000 Usn: 202913 UpdatedTime: 2025-07-29T17:53:55.773476555+08:00 IsBlog: true tags: \[] --------- # 汇编 1. 常用命令 | 命令 | 用法 | 说明 | 机器码 | | ------- | ------- | --------------------------------------- | ------- | | cmd | cmp a,b | 比较a与b | <br /> | | mov | mov a,b | 把b的值送给a,使a=b | <br /> | | call | <br /> | 调用子程序,子程序以ret结尾 | <br /> | | ret | <br /> | 返回主程序 | <br /> | | nop | <br /> | 无作用,英文"no operation"的简写,意思是"do nothing" | 90 | | je/jz | <br /> | 若相等则跳 | 74或0F84 | | jne/jnz | <br /> | 若不相等则跳 | 75或0F85 | | jmp | <br /> | 无条件跳 | EB | | jb | <br /> | 若小于则跳 | 72 | | ja | <br /> | 若大于则跳 | <br /> | | jg | <br /> | 若大于则跳 | <br /> | | jge | <br /> | 若大于等于则跳 | <br /> | | jl | <br /> | 若小于则跳 | <br /> | | jle | <br /> | 若小于等于则跳 | <br /> | | pop | pop xx | xx出栈 | <br /> | | push | push xx | xx压栈 | <br /> | 汇编指令修改 相应的机器码修改(通过16进制编辑器实现) | 原命令 | 替代命令 | 机器码 | | ------- | ---- | ------------------------- | | jnz/jne | nop | 75->90 | | jnz/jne | jmp | 75-> EB | | jz/je | nop | 74->90 | | jz/je | jmp | 74-> EB | | jnz | jz | 75->74 或 0F 85 -> 0F 84 | | jz | jnz | 74->75 或 0F 84 -> 0F 85 | | jnz | jz | 75->74 或 0F 85 -> 0F 84 | | je | jne | 74->75 或 0F 84 -> 0F 85 | 在使用汇编指令时,除了了解基本命令和其对应的机器码,还需要注意条件跳转指令的逻辑判断条件。以下是一些关键点: ### 条件跳转指令的条件码 条件跳转指令的执行依赖于标志寄存器中的状态标志。例如: * **JE/JZ**:跳转如果零标志(ZF)为1,即比较结果相等。 * **JNE/JNZ**:跳转如果零标志(ZF)为0,即比较结果不相等。 * **JB**:跳转如果进位标志(CF)为1,即无符号数小于。 * **JA**:跳转如果进位标志(CF)为0,即无符号数大于。 * **JG**:跳转如果符号标志(SF)和零标志(ZF)满足条件,即有符号数大于。 * **JGE**:跳转如果符号标志(SF)和零标志(ZF)满足条件,即有符号数大于等于。 * **JL**:跳转如果符号标志(SF)和零标志(ZF)条件相反,即有符号数小于。 * **JLE**:跳转如果符号标志(SF)和零标志(ZF)条件相反,即有符号数小于等于。 这些条件码在实际编程中非常重要,因为它们决定了程序流程的分支逻辑。例如,`cmp`指令比较两个操作数后,根据结果设置相应的标志位,然后用条件跳转指令决定程序下一步跳转到哪个位置。 ### 实际应用示例 假设我们有一个简单的比较并跳转的示例: ```asm cmp ax, bx je label1 jne label2 ``` 这段代码中,如果`ax`和`bx`相等,则跳转到`label1`;否则跳转到`label2`。如果我们希望将`je`改为无条件跳转,可以将其机器码`74`替换为`EB`。 ### 机器码替换注意事项 1. **确保指令长度一致**:当替换指令时,需确保替换后的机器码长度与原指令一致。否则可能导致程序逻辑错误。 2. **考虑跳转范围**:`jmp`和`jz`、`jne`等指令的跳转范围有限(通常为-128到+127字节),若跳转距离过远,需使用`ljmp`或`ljgz`等长跳转指令。 3. **保持代码结构清晰**:通过替换指令实现跳转逻辑时,建议使用注释或逻辑图来说明代码的执行流程,便于后续维护。 如需进一步操作,可以通过16进制编辑器手动修改机器码,或使用工具如`objdump`、`IDA Pro`等进行反汇编和重编译。 最后修改:11天前 © 著作权归作者所有