版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。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-----溺心與沉浮----博客園