寄存器分爲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是一樣的道理 相關鏈接:http://bbs.ichunqiu.com/thread-8744-1-1.html?from=csdnJG |
彙編(通用寄存器_內存讀寫)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.