匯編指令之ADC、SBB、XCHG、MOVS指令


版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-25,23:52:49
作者By-----溺心與沉浮----博客園  

  介紹完這些基礎指令,后面就講到匯編JCC指令了,我覺得介紹指令不應該只是簡簡單單的就介紹怎么用,匯編它其實也是高級語言,相信你讀完我前面的文章就可以看到,我介紹PUSH、POP那節,都是用其他指令去執行PUSH、POP的過程,匯編它也由基礎指令,高級指令構成,基礎指令可以還原高級指令,加深對指令的理解,使得在分析程序時不再那么難受,還要想一想這個是什么過程,多練習練習,使其成為一種自然反射,久而久之就成一個熟悉過程了。

ADC指令:帶進位加法

  格式:ADC  R/M,R/M/IMM   兩邊不能同時為內存  寬度要一樣(R為register,M為memory,IMM為immediate operand)

  ADC AL,CL

  ADC BYTE PTR DS:[18FF8C],2

  ADC BYTE PTR DS:[18FF8C],AL

ADC其實與ADD差別不大,只不過ADC它是帶進位的加法,我們來看OD中操作的過程,我們先將C位,置位1,添加左上角的代碼

按F8執行代碼至下圖所示,EAX里的值為1,ECX里的值為2

 

 

我們再次執行ADC AL,CL這行代碼,F8往下走

 

我們執行ADC BYTE PTR DS:[18FF8C],2

 

按F8執行完上述代碼如圖所示

我們發現相加2之后   0x0018FF8C里的值從75F2338A變為75F2338D

 我們再來試試與寄存器相加的情況   

  MOV AL,1

  ADC BYTE PTR DS:[18FF8C],AL

 

 

版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-25,23:52:49
作者By-----溺心與沉浮----博客園

 

按F8執行代碼如下圖所示

 

0x18FF8C里的值加上AL的值之后從0x75F2338D變為0x75F2338F

 

 SBB指令:帶借位減法

 格式:SBB  R/M,R/M   兩邊不能同時為內存  寬度要一樣

   SBB AL,CL

   SBB BYTE PTR DS:[12FFC4],2

   SBB BYTE PTR DS:[12FFC4],AL

 

執行完SBB AL,CL指令后如下所示

 

發現EAX里的值為0x01

 

  SBB BYTE PTR DS:[18FF8C],2

  SBB BYTE PTR DS:[18FF8C],AL

這兩行代碼請讀者自行嘗試,筆者這里就不貼圖了,介紹后面的指令

 

XCHG指令:交換數據

 格式:XCHG  R/M,R/M/IMM   兩邊不能同時為內存  寬度要一樣

   XCHG AL,CL

   XCHG DWORD PTR DS:[12FFC4],EAX

   XCHG BYTE PTR DS:[12FFC4],AL

 

執行完代碼后如下所示

 

 

 MOVS指令:移動數據  內存-內存

 movs指令是匯編少有的兩邊都可以是memory的指令,MOVS在開發中通常極有可能是一串字符串的復制

   BYTE/WORD/DWORD

  MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]        簡寫為:MOVSB

這行代碼的意思是從ESI里頭的值代表的內存編號中取一個字節的值放到EDI里的值所代表的的內存編號中,其指令可以簡寫為MOVSB,后面的word與dword相同

  MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]          簡寫為:MOVSW

  MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]          簡寫為:MOVSD

 

我們已4字節的DWORD為例:如下圖所示

我們去內存區域中隨便找一塊地址,這里我們將0x18FFB0給到EDI,0x18FFA0給到ESI,然后在指令輸入窗口輸入MOVSD就行,OD就會自動轉換為箭頭中所指的代碼

 

按F8代碼向下執行兩步

 

再執行一步

 

仔細觀察紅框中所標記的,我們發現,執行完代碼過后,ESI所代表的地址編號里的值給到了EDI所代碼的地址編號中去了,然后ESI,EDI的值加了4,,我們再來看看MOVSW,兩個字節的情況,看看內存區域與寄存器區域中ESI,EDI的值得變化,這次我們重新找塊內存編號

 

MOV ESI,0x18FFAC

MOV EDI,0x18FFC4

MOVSW(OD會自動轉換為MOVS WORD PTR ES:[EDI], WORD PTR DS:[ESI])

 

 

版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-25,23:52:49
作者By-----溺心與沉浮----博客園

 

執行兩步代碼如下所示

 

再執行最后一步代碼如下所示

 

我們可以看到內存區域中0x18FFAC中的低四位寫入到了0x18FFC4中的低4位,ESI與EDI中的值分別加2。

 我們前面博文中講過EFLAG寄存器中的6個,還剩下3個沒講,那3個之前就說過我們后面有用到會再列博文來講,今天我們MOVS指令就會用到其中一個,學匯編啊,買書看的效果不好就是這個,書就是歸納總結的結晶,前面呱啦呱啦總結一大堆,你沒看個明白,到后面單獨章節的時候就有可能忘記了,我們學匯編,用到什么就學什么,學透用透,這樣才能把整體知識融會貫通

 

 我們改變EFLAG中的D位的值,將其改變為1,再來演示一下MOVSD(MOVSW,MOVSB建議讀者自行測試一下,是一樣的),我們前面演示的MOVSD與MOVSW呢,EFLAG中的D位的值是0。

  MOV ESI,0x18FF98

  MOV EDI,0x18FFB4

  MOVSD

 

 按F8向下執行如下圖所示

 

我們可以看到之前ESI所代表的的內存編號0x18FF98中的值0x77529F72給到了之前EDI所代表的內存編號0x18FFB4中,ESI與EDI的值在D位為1的情況下,減去了4字節(讀者有興趣可以試試MOVSW,MOVSB)

 

 版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-25,23:52:49
作者By-----溺心與沉浮----博客園


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM