命令栏指令
一、OD调试
重新开始:Ctrl+F2
转到地址:CTRL+G
断点切换: F2
断点窗口: Alt+B
运行 : F9
暂停 : F12
单步步过: F8 //遇到CALL跳过
单步步入: F7 //遇到CALL进入
运行到选定位置 :F4 //这个主菜单上没有,右键菜单-断点-F4
反汇编窗口中跟随 :回车键enter
跟随: 回车键enter //进入某个地址
右键菜单--转到
+号:转到下一步 //Plus
-号:转到上一步 //Minus
*号:转到当前指令地址 //EIP
寄存器窗口:
二、命令栏指令
bp 下断点
bc 清除断点
dd 以双字方式显示数据
dw 以字方式显示数据
db 以字节方式显示数据
? 计算表达式的值
ZF零标志位:若当前的运算结果为零,则ZF为1,否则为0。
SF符号标志位:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。
OF溢出标志位:若运算结果超出机器能够表示的范围称为溢出,此时OF为1,否则为0。判断是否溢出的方法是:进行二进制运算时,最高位的进位值与次高位的进位值进行异或运算,若运算结果为1则表示溢出OF=1,否则OF=0
PF奇偶标志:当运算结果的最低16位中含1的个数为偶数则PF=1否则PF=0
AF辅助进位标志:一个加法(减法)运算结果的低4位向高4位有进位(或借位)时则AF=1否则AF=0
另外还有三个控制标志位用来控制CPU的操作,可以由程序进行置位和复位。
TF跟踪标志:该标志位为方面程序调试而设置。若TF=1,8086/8088CPU处于单步工作方式,即在每条指令执行结束后,产生中断。
IF中断标志位:该标志位用来控制CPU是否响应可屏蔽中断。若IF=1则允许中断,否则禁止中断。
DF方向标志:该标志位用来控制串处理指令的处理方向。若DF=1则串处理过程中地址自动递减,否则自动递增。
OD里能查看到 除IF标志外的 8个标志位
一、指令格式
条件转移指令 JL/JNGE
格式: JL/JNGE 标号地址
功能: 小于/不大于等于时转移 标号地址
JNGE 有符号 不大于等于 则跳转 //Jump if Not Greater or Equal
JL 有符号 小于 则跳转 //Jump if Less
SF=1; 符号标志位为1 则跳转到标号地址执行
// jlgoto.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
printf("begin\n");
//>=
int a=0xA;
int b=0x20;
//if (a>=b) //jl
//{
// printf("do this");
//}
//S上方的代码为c语言代码 下方的代码为汇编语言代码 本质上是相同的
__asm
{
mov ebx,b
sub a,ebx//在这时因为a-ebx等于负数了 所以符号标志位为1
jnge end//jnge和jl所描述的是一个东西
mov ebx,ebx
jl end
}
//<
end:
printf("end\n");
return 0;
}
image.png
001A1012 |. 83C4 04 add esp,0x4
001A1015 |. C745 FC 0A000>mov dword ptr ss:[ebp-0x4],0xA ; a=0xA
001A101C |. C745 F8 20000>mov dword ptr ss:[ebp-0x8],0x20 ; b=0x20;
001A1023 |. 8B5D F8 mov ebx,dword ptr ss:[ebp-0x8] ; ebx =0x20
001A1026 |. 295D FC sub dword ptr ss:[ebp-0x4],ebx ; 0xA-0x20这时会把符号标志位sf为1
001A1029 |. 7C 04 jl short jlgoto.001A102F ; 当符号标志位为1时 jl会跳转到地址 001A102F
001A102B |. 8BDB mov ebx,ebx
001A102D |. 7C 00 jl short jlgoto.001A102F
001A102F |> 68 FC201A00 push jlgoto.001A20FC ; /format = "end
"
001A1034 |. FF15 A0201A00 call dword ptr ds:[] ; \printf
001A103A |. 83C4 04 add esp,0x4
001A103D |. 33C0 xor eax,eax