匯編(通用寄存器_內(nèi)存讀寫)寄存器分為64位 32位 16位 8位寄存器粥鞋,現(xiàn)階段最多的就是64位寄存器,不過好多程序都是32位的,寄存器的位數(shù)是由計(jì)算機(jī)發(fā)展決定的
下面是他們的關(guān)系結(jié)構(gòu):
32位寄存器前面是32位的名詞瞄崇,后面是16位寄存器呻粹,而16位寄存器又由2個(gè)8位的寄存器組成
mov指令:
MOV EAX(目標(biāo)操作數(shù)),0xAAAAAA(原操作數(shù))
這段代碼的意思是把0xAAAAAA復(fù)制一份給EAX
匯編語言就是不停的移動(dòng)數(shù)據(jù),程序越復(fù)雜苏研,數(shù)據(jù)流動(dòng)就越復(fù)雜,逆向就是分析數(shù)據(jù)跑來跑去是怎么跑的等浊!
代碼操作:
現(xiàn)在我們可以看見
eax=de856253
而我們匯編代碼為
mov eax,0xaaaaaaaa
此時(shí)當(dāng)我們執(zhí)行
我們的eax就變成了AAAAAAAA
接下來摹蘑,我們的代碼是:
mov ax筹燕,0xbbbb
我們?cè)诎焉厦娴囊粡垐D拿來:
AX是EAX里面的,所以我們運(yùn)行代碼后eax的值應(yīng)該是
EAX = 0xAAAABBBB
現(xiàn)在我們運(yùn)行一下:
果然不出我們所料eax的值變成了0xAAAABBBB
然后我們第3條代碼為:
mov ah,0xDD
由上圖我們可以看出來AH是AX的前2位撒踪,當(dāng)我們運(yùn)行程序寄存器EAX的值應(yīng)該是:0xAAAADDBB
接下來就是最后一條語句了
mov al过咬,0xff
AL是AX中的后2位,如果我們?cè)俅芜\(yùn)行的話EAX的值應(yīng)該變成0xAAAADDFF
接下來我們嘗試把EXA的值復(fù)制到ECX中去制妄,代碼是:
mov ECX,EAX
我們可以看見此時(shí)我們EAX的值為:
那么當(dāng)我們執(zhí)行此語句后ECX的值也會(huì)是AAAADDFF
重上圖可以看見ECX的值已經(jīng)變成和EAX一樣了
以下是mov的語法
看不懂的話掸绞,我會(huì)一個(gè)一個(gè)的解釋
MOV r/m8,r8
r/m8的意思可以是通用的8位寄存器耕捞,也可以是8位內(nèi)存
整句話的意思是可以把8位的通用寄存器的值復(fù)制給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
此時(shí)我們
EAX=0xAAAADDFF
ECX=0xAAAADDFF
運(yùn)行代碼后為
EAX=0xAAAAFFFF
可以看見我們的值變了
注意一點(diǎn):8位必須對(duì)應(yīng)8位俺抽,16位對(duì)應(yīng)16位具篇,32位對(duì)應(yīng)32位
下面我解釋下立即數(shù):
立即數(shù)在這里就是8-32位的16進(jìn)制數(shù)
比如:
mov ax,0x8f8d
可以看見我們EAX的值重0xAAAAFFFF變成了0xAAAA8F8D
那么其他的imm8,imm16凌埂,imm32也是一樣的
ADD指令:
ADD 寄存器,值
目標(biāo)操作數(shù)=目標(biāo)操作數(shù)+原操作數(shù)
代碼演示:
add eax,0xFF
此時(shí)我們eax的值為:
我i們運(yùn)行代碼
我們的寄存器的值變成了:aaab00fe
我們用計(jì)算器來驗(yàn)證正確性:
我們計(jì)算一下:
和我們寄存器的值是一樣的
ADD的語法和mov是一樣的
sub是減法,和ADD是一樣的道理
有興趣的可以看下作業(yè):
mov eax,0xAD8596FF
ADD EAX,0xDF
mov ecx,eax
sub ecx诗芜,0x6
mov eax,ecx
add al瞳抓,ah
sub ax,cx
mov edx伏恐,eax
提示:親孩哑,請(qǐng)別用OD之類的工具,用筆記本+計(jì)算器算哦翠桦!
求:最后edx的值 = =
答案在下期公布
來源:http://bbs.ichunqiu.com/thread-8744-1-1.html?from=ch