匯編(通用寄存器_內存讀寫)

匯編(通用寄存器_內存讀寫)寄存器分為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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容