按F7键,执行指令DEC EAX,EAX将会由1变成0。
也可以增加或者减少内存单元中的值。
上面的内存单元并不会增加1,而是引发异常,因为该内存地址我们不具有写权限。
如果这里有写权限的话,结果会是怎么样的呢?我们去数据窗口查看405000地址。
反过来读取,就会是00001000,增加1的话,就变成00001001。
这是给DWORD这个4字节的值增加1的情况。 对于WORD来说增加1到最后两个字节中。
对于BYTE来说增加1到最后一个字节。
ADD
21
ADD指令有两个操作数,相加后的结果存放到第一个操作数中。ADD EAX,1等价于INC EAX。ADD也将两个寄存器相加,我们可以到OD里面看一看。
执行该语句之前:
在我的机器上EAX的值是00000000,ECX的值是12FFB0。你的机器上可以是其他的值,你可以自己修改它们,当你按下F7键,这两个寄存器相加,结果存放到EAX中,一起来看看。
由于EAX被修改了,所以变成了红色,相加的结果保存在其中。 也可以将寄存器与内存单元的内容相加。
在这种情况下,是否对该内存地址具有写权限都没有问题,因为相加的结果是存放到EAX寄存器中的,[405000]内存单元的值并没有改变。因为并不会引发异常。 按下F7键之前,EAX的值为0,405000内存单元中的值为00001000。
22
按F7键,计算它们的和。
EAX的初始值是0,现在变成了1000。如果你想把结果存放到内存单元中,我们可以这么写:
在这种情况下,结果存放到405000内存单元中,按下F7键,由于我们对该内存单元没有写权限,当尝试修改该内存单元的值时候,发引发异常。
ADC(带进位的加法)
在这种情况下,两个操作数的和加上进位标志的值,结果存放到第一个操作数中。
这里我们可以看到,EDX的值为21,加上3,已经进位标志,在这里,进位标志为0,按下F7键。
23
看到结果为24。现在双击你的鼠标将进位标志修改为1,然后重复上面的操作。
我们通过修改进位标志,然后重新执行这条指令。
按F7键,看,结果是25。
由于EDX的值为21,然后一个数值3,然后进位标志1,所以结果为25。 SUB
这个指令与ADD刚好相反-它将第一个操作数减去第二个操作数的值存放到第一个操作数中。
24
在我的机器上,执行这条指令之前,寄存器的情况如下:
按下F7键,EAX的0减去2。
16进制的结果为FFFFFFFE,在这个值上面双击鼠标,你可以看到十进制的值为-2。
我们可以看到十进制为-2。
另外也可以使用该指令来计算寄存器的值来寄存器的值,寄存器的值减去内存单元的值。 SUB EAX,ECX
即EAX-ECX的值保存到EAX中。 和
SUB EAX,DWORD PTR DS:[405000]
寄存器EAX减去405000内存单元的值,并将结果保存在EAX中。 SUB DWORD PTR DS:[405000],EAX
这种情况下,由于我们对405000这个内存单元没有写权限,将结果存放到其中的话,会引发一个异常。 SBB
该指令跟ADC正好相反,它计算两个操作数的差值,并且还要减去进位标志,结果存放到第一个操作数中。
25