版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。23:28:13,23:28:19
作者By-----溺心與沉浮----博客園
STOS指令:講Al/AX/EAX的值存儲到[EDI]指定的內存單元
STOS BYTE PTR ES:[EDI] 簡寫為STOSB
STOS WORD PTR ES:[EDI] 簡寫為STOSW
STOS DWORD PTR ES:[EDI] 簡寫為STOSD
具體是AL/AX/EAX那就要看具體的寬度是多少,STOS指令同樣受D位的影響(Direction Flag),當D位為1的時候,EDI的值會減,當D位為0時,EDI的值會加,前面的博文中有講過,MOVS指令也是受D位影響
之前在往內存地址中寫入東西時,都是用的DS:,這里用到EDI時,統一使用ES,段寄存器,還沒涉及,暫且就先這樣記住
MOV EAX,12345678
MOV EDI,18FF8C
STOS DWORD PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS BYTE PTR ES:[EDI]
按下F8,執行STOSD指令,仔細觀察EDI的值
可以看到,在執行完STOSD指令后,EAX里的值往EDI所代表的地址編號里頭寫入后,EDI的值減去了4,再來看看STOSW,STOSB
可以看到,執行完STOSW指令后,EAX里的低16位往EDI所代表的內存編號中的低16位寫入后,EDI的值減去了2,由於我們代碼是連續執行的,這一步的EDI的值用的是上一步EDI的值減4后的值,也即0x18FF88
再來看看STOSB指令,接着按F8代碼往下走
這里可以看到,EDI的值0x18FF86減去一個字節后變為0x18FF85,再將AL里的值寫入EDI中
版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。23:28:13,23:28:19
作者By-----溺心與沉浮----博客園
我們將Direction Flag的值更改為0,在執行下述代碼
MOV EAX,12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
執行第一步,第二步代碼后如下:
執行前不要忘記將D位置成0,我添加代碼的時候忘記了,執行STOSB的時候更改回來了,接着執行STOSB,仔細觀察如下:
通過觀察,我們看到EDI的值加1,AL的值被寫入到0x18FF70中,注意:只有低8位被寫入!!!
執行STOSW
觀察得知,EDI的值從0x18FF71加2之后,變為0x18FF73,觀察內存區域的0x18FF70,可以看到,0x18FF71,0x18FF72中寫入了,56,78兩個值
執行STOSD指令
EDI的值從0x18FF73加上4之后變為0x18FF77,如果讀者你不懂為什么寫入的形式是圖中所示的形式,我建議你把內存拆分開來,用一個字節一個字節去看,然后畫個圖,相信你就明白了,你可以已0x18FF73為開始起點,4字節4字節的自己重新畫個圖,這時候,后面的內存編號就會是0x18FF77,0x18FF7B,0x18FF7F
REP指令:按計數寄存器 (ECX) 中指定的次數重復執行字符串指令
REP指令會根據計數寄存器ECX中的值來指定次數,重復執行指令,注意:下面代碼里MOV ECX,10, 10所代表的的十六進制的10,是十進制中的16
MOV ECX,10
REP MOVSD
REP STOSD
版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。23:28:13,23:28:19
作者By-----溺心與沉浮----博客園
執行前兩步代碼后如下:
執行REP STOSD
執行完REP STOSD之后,ECX里的值歸0了,因為每執行一次,ECX里的值都會減1直至為0,觀察圖中內存區域,數一下,一共是寫入了16次0x12345678,EDI的值也變為了EDI + ECX * 4。
接着看REP MOVSD
執行前兩步代碼如下
執行REP MOVSD,啊哦,有點尬,還剩3次執行完的時候,我堆棧已經走到底了,,,
我重新打開一遍0D,執行一下REP MOVSD
版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。23:28:13,23:28:19
作者By-----溺心與沉浮----博客園
執行REP MOVSD指令
ESI與EDI都增加了ECX * 4,64個字節0x40,大家有興趣可以將D位更改為1,嘗試一下,REP STOSD,REP STOSW,REP STOSB, REP MOVSD,REP MOVSW,REP MOVSB指令
1、用MOVS指令分別移動5個字節、5個字、5個雙字
2、用STOS指令分別存儲5個字節、5個字、5個雙字
3、使用REP指令重寫第1、2題
嗯,這些都是本節將的指令相關內容,這三個題,博文中也有寫,只不過,最多就寫了2次,3次,大家可以用MOVS,STOS多寫寫,代替REP,等到寫吐了,也就理解了REP了,這三題就不寫了。
版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。23:28:13,23:28:19
作者By-----溺心與沉浮----博客園