第15节: 要点回顾和新指令的用法
1、前面我们主要讲了两个问题分别是:
1)数据可以存在哪里,可以在CPU的寄存器里或者在内存中,CPU存储的数据是有限的,如果太大了,可以存到内存中。
2)数据是如何存放的,前面讲到了大端模式和小端模式。
这两个问题弄清楚了,那就知道怎么样处理类似这两的问题的内容了,那么想处理数据我们必须学习新的汇编指令,从这节开始一一介绍。
2、指令分为:
r/m8,r8 r/m16,r16 r/m32/r32 r/m32,imm等我这里就不一一列举了。
r代表通用寄存器、m代表内存、imm代表立即数、
r8代表8位通用寄存器、m8代表8位内存、imm8代表8位立即数(16位和32位也是一样的)
1)MOV指令(移动):
MOV r/m16,r16这个是说可以是通用寄存器16位或16位内存,后面的r16就是16位的通用寄存器,这个例子是将通用寄存器存到通用寄存器里,也可以是内存数据存到通用的寄存器里。
例子:MOV WORD PTR DS:[0x189FFAC0],AX,结果将AX的值存到0x189FFAC0里。
2)ADD指令(加法):
ADD r/m32,r32
例子:ADD EAX,ECX,将EAX跟ECX相加,在olldebug工具中的寄存器窗口将EAX的值改为:1,ECX的值改为:2,当执行相加后EAX=3。
3)SUB指令(减法)
SUB r8,r/m8
例子:SUB AL,BYTE PTR DS:[0x189FFAC0] ,把al的值设置为:3,在把堆栈中的189FFAC0的值设置为:2,最后AL得到的结果是1。
4)AND指令(与运算)
AND r/m32,r32
例子:AND DWORD PTR DS:[0x189FFAC0],EAX 就是说189FFAC0的值和EAX的值进行与运算,最后堆栈中的189FFAC0的结果是0(注意:001 和 0010与运算结果是0)
5)OR指令(或运算)
OR r/m32,r32
例子:OR DWORD PTR DS:[0x189FFAC0],EAX,将EAX设置为:1,将0x189FFAC0设置为:0,最后的结果为1。
6)XOR指令(异或运算)
XOR r/m32,r32
例子:XOR DWORD PTR DS:[0x189FFAC0],EAX,将EAX设置为:1,将0x189FFAC0设置为:1,最后的结果为0。
7)NOT指令(非运算)
NOT r/m32
例子:NOT DWORD PTR DS:[0x189FFAC0] 将0x189FFAC0设置为:0,最后的结果是FFFFFFFF。
1、前面我们主要讲了两个问题分别是:
1)数据可以存在哪里,可以在CPU的寄存器里或者在内存中,CPU存储的数据是有限的,如果太大了,可以存到内存中。
2)数据是如何存放的,前面讲到了大端模式和小端模式。
这两个问题弄清楚了,那就知道怎么样处理类似这两的问题的内容了,那么想处理数据我们必须学习新的汇编指令,从这节开始一一介绍。
2、指令分为:
r/m8,r8 r/m16,r16 r/m32/r32 r/m32,imm等我这里就不一一列举了。
r代表通用寄存器、m代表内存、imm代表立即数、
r8代表8位通用寄存器、m8代表8位内存、imm8代表8位立即数(16位和32位也是一样的)
1)MOV指令(移动):
MOV r/m16,r16这个是说可以是通用寄存器16位或16位内存,后面的r16就是16位的通用寄存器,这个例子是将通用寄存器存到通用寄存器里,也可以是内存数据存到通用的寄存器里。
例子:MOV WORD PTR DS:[0x189FFAC0],AX,结果将AX的值存到0x189FFAC0里。
2)ADD指令(加法):
ADD r/m32,r32
例子:ADD EAX,ECX,将EAX跟ECX相加,在olldebug工具中的寄存器窗口将EAX的值改为:1,ECX的值改为:2,当执行相加后EAX=3。
3)SUB指令(减法)
SUB r8,r/m8
例子:SUB AL,BYTE PTR DS:[0x189FFAC0] ,把al的值设置为:3,在把堆栈中的189FFAC0的值设置为:2,最后AL得到的结果是1。
4)AND指令(与运算)
AND r/m32,r32
例子:AND DWORD PTR DS:[0x189FFAC0],EAX 就是说189FFAC0的值和EAX的值进行与运算,最后堆栈中的189FFAC0的结果是0(注意:001 和 0010与运算结果是0)
5)OR指令(或运算)
OR r/m32,r32
例子:OR DWORD PTR DS:[0x189FFAC0],EAX,将EAX设置为:1,将0x189FFAC0设置为:0,最后的结果为1。
6)XOR指令(异或运算)
XOR r/m32,r32
例子:XOR DWORD PTR DS:[0x189FFAC0],EAX,将EAX设置为:1,将0x189FFAC0设置为:1,最后的结果为0。
7)NOT指令(非运算)
NOT r/m32
例子:NOT DWORD PTR DS:[0x189FFAC0] 将0x189FFAC0设置为:0,最后的结果是FFFFFFFF。