使用OD进行mov、xchg、lea、and、or、not、xor、add、sub、inc、dec、push、pop等汇编指令操作,并仔细观察每个指令执行后CPU寄存器(EAX、EBX、ECX、EDX、EDL、ESL、EBP、ESP、EIP及Eflags状态)、内存以及堆栈的变化。
-
实验环境
操作环境:windows10
实验工具:Ollydby
-
实验过程与分析
-
Mov指令
-
把mov dword ptr ds:[403020],eax指令写入反汇编窗口中执行
前四位65 72 20 56变成了CC FF 19 00,Eax寄存器向内存地址[403020]传递了一个DWORD宽度的数据。数据以小尾方式存储,00403020地址连续占用了四个字节的地址
把mov word ptr ds:[403028],ax指令写入反汇编窗口中执行
前两位65 73变成了CC FF,ax寄存器向内存地址[403028]传递了一个WORD宽度的数据。数据以小尾方式存储,00403028地址连续占用了两个字节的地址
把mov byte ptr ds:[403030],al指令写入反汇编窗口中执行
前一位6F变成了CC,al寄存器向内存地址[403028]传递了一个BYTE宽度的数据。数据以小尾方式存储,00403030地址占用了一个字节的地址
-
Xchg指令
xhcg ax,bx ;交换16位寄存器的值
xchg ah,al ;交换8位寄存器的内容
xchg var1,bx;交换16位内存操作数和BX寄存器的内容
xchg eax,ebx ;交换32位寄存器内容
输入指令xchg eax,ebx,执行交换寄存器eax与寄存器ebx的数据
输入指令xchg dword ptr ds:[403020],ebx,执行交换地址403020与寄存器ebx的数据,地址403020的数据以小尾方式存储,只交换了前四个数
输入指令xchg word ptr ds:[403028],cx,执行交换寄存器cx与地址[403028]的数据,只交换了前两个数据
-
Lea指令
将内存单位的地址送至指定的寄存器
执行mov eax,dword ptr ds:[403000],cx指令,寄存器eax得到地址403000中的前四位数据48 65 6C 6C
执行lea ebx,dword ptr ds:[403000]指令,寄存器得到地址403000的编号403000
-
And指令
执行·mov eax,0b指令
寄存器eax的值变成0b
执行and eax,9指令进行与操作,eax的值变为9(转换二进制后运算)
-
Or指令
执行mov eax,1100011b使eax的值为1100011b,再执行or eax,0000100b,进行或运算(只有同为0才为0),eax的值变为1100111b
-
Not指令(逻辑取反)
1变0,0变1(二进制)
-
Xor指令(化为二进制进行按位异或,00得0,11得0,01得1)
执行xor eax,eax使eax值为00000000
将eax值改为12345678
执行两次xor eax,87654321后eax的值变为原来的12345678(第一次与自己异或得到0,第二次异或得到本身)
-
Add指令
执行加法
将bl的值加到al
-
Sub指令
执行减法,al值原为0019FF03,减去bl(0019FF02)后,al值为(0019FF01)
-
Adc指令(带进位加法)
-
Sbb指令(带借位减法)
Bl-Al,即0019FF03-0019FF02
-
Inc指令
执行加一运算,al值由0019FF01变为0019FF02
-
Dec指令
执行减一
原来的49变成48
-
Push指令
入栈顺序是先入栈序号低的寄存器到最低地址。Push指令分别将12345678、1234、12进行入栈,esp的值依次减4
-
Pop指令
出栈顺序和入栈顺序相反
两次mov指令通过esp、ebp来获取上面入栈的值
Pop指令将入栈的数据送入eax、ebx、ecx;esp依次加4