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

  寄存器分爲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

發佈了46 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章