匯編指令之STOS、REP


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


免責聲明!

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



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