匯編(通用寄存器_內存讀寫)寄存器分為64位 32位 16位 8位寄存器,現階段最多的就是64位寄存器,不過好多程序都是32位的,寄存器的位數是由計算機發展決定的
下面是他們的關系結構:
32位寄存器前面是32位的名詞,后面是16位寄存器,而16位寄存器又由2個8位的寄存器組成
mov指令:
MOV EAX(目標操作數),0xAAAAAA(原操作數)
這段代碼的意思是把0xAAAAAA復制一份給EAX
匯編語言就是不停的移動數據,程序越復雜,數據流動就越復雜,逆向就是分析數據跑來跑去是怎么跑的!
代碼操作:
現在我們可以看見
eax=de856253
而我們匯編代碼為
mov eax,0xaaaaaaaa
此時當我們執行
我們的eax就變成了AAAAAAAA
接下來,我們的代碼是:
mov ax,0xbbbb
我們在把上面的一張圖拿來:
AX是EAX里面的,所以我們運行代碼后eax的值應該是
EAX = 0xAAAABBBB
現在我們運行一下:
果然不出我們所料eax的值變成了0xAAAABBBB
然后我們第3條代碼為:
mov ah,0xDD
由上圖我們可以看出來AH是AX的前2位,當我們運行程序寄存器EAX的值應該是:0xAAAADDBB
接下來就是最后一條語句了
mov al,0xff
AL是AX中的后2位,如果我們再次運行的話EAX的值應該變成0xAAAADDFF
接下來我們嘗試把EXA的值復制到ECX中去,代碼是:
mov ECX,EAX
我們可以看見此時我們EAX的值為:
那么當我們執行此語句后ECX的值也會是AAAADDFF
重上圖可以看見ECX的值已經變成和EAX一樣了
以下是mov的語法
看不懂的話,我會一個一個的解釋
MOV r/m8,r8
r/m8的意思可以是通用的8位寄存器,也可以是8位內存
整句話的意思是可以把8位的通用寄存器的值復制給8位的地址或者8位的通用寄存器
代碼演示:
file:///C:/Users/Xuanxuan/Documents/My%20Knowledge/temp/1ccd35f7-f0ac-424c-8b3c-244b0588923c.jpg
代碼:
mov ah,cl
重上圖可以看出 AH和CL都是8位寄存器這句代碼翻譯到上面的匯編格式為:
mov r8,r8
此時我們
EAX=0xAAAADDFF
ECX=0xAAAADDFF
運行代碼后為
EAX=0xAAAAFFFF
可以看見我們的值變了
注意一點:8位必須對應8位,16位對應16位,32位對應32位
下面我解釋下立即數:
立即數在這里就是8-32位的16進制數
比如:
mov ax,0x8f8d
可以看見我們EAX的值重0xAAAAFFFF變成了0xAAAA8F8D
那么其他的imm8,imm16,imm32也是一樣的
ADD指令:
ADD 寄存器,值
目標操作數=目標操作數+原操作數
代碼演示:
add eax,0xFF
此時我們eax的值為:
我i們運行代碼
我們的寄存器的值變成了:aaab00fe
我們用計算器來驗證正確性:
我們計算一下:
和我們寄存器的值是一樣的
ADD的語法和mov是一樣的
sub是減法,和ADD是一樣的道理
有興趣的可以看下作業:
mov eax,0xAD8596FF
ADD EAX,0xDF
mov ecx,eax
sub ecx,0x6
mov eax,ecx
add al,ah
sub ax,cx
mov edx,eax
提示:親,請別用OD之類的工具,用筆記本+計算器算哦!
求:最后edx的值 = =
答案在下期公布
來源:http://bbs.ichunqiu.com/thread-8744-1-1.html?from=ch