2016-04-29 77 views
2

在IA-32英特爾指令集參考中,STOS/STOSB/STOSW/STOSD,指令stos m32stosd有什麼區別,是不是它們的描述是一樣的?
m32的功能是什麼?當我們使用該指令時,我們應該設置eaxesedim32操作數是否有效?彙編:`stos m32`和`stosd`助記符有什麼區別?

+0

聽起來很奇怪,但使用STOS與內存操作數使得彙編使用** **大小的內存操作數(字節,字,雙字)來確定是否將其編碼爲STOSB,STOSW,STOSD。 –

+0

然後是否使用'm32'操作數,它只是用來確定內存operande的大小,所以只要大小正確,我們就可以隨機選擇'm32'操作數。 @MichaelPetch – zhenguoli

+0

它只用於尺寸。它指向的內容被忽略。我認識的大多數開發人員使用STOSB,STOSW,STOSD。如果您使用_MASM_,則是一個例外。在那個環境中,當你聲明一個變量MASM時,會跟蹤變量的類型。最終結果是相同的 - 只是使用大小。 –

回答

2

STOS m32形式和STOSD形式是表達相同指令的兩種不同方式。您可能已經注意到,在較新的SIMD(SSE,AVX等...)指令之外,大多數指令助記符沒有後綴,指示它們執行的操作的大小。例如沒有INCD或MOVW指令。相反,操作數的大小決定了操作的大小。 STOS m32表格允許此指令符合此慣例。

在MASM這允許像下面的代碼,其中STOS指令的大小取決於符號的類型(尺寸):

array DW 30 DUP (?) 

    mov ecx, LENGTH array 
    mov edi, OFFSET array 
    mov eax, 1 
    rep stos array 

更改DW到DD和代碼將填補個DWORD的以1s的陣列而不是一組WORD。請注意,僅使用內存操作數的大小。該指令仍寫入由EDI給出的地址。

雖然它不適用於STOS,但某些其他字符串指令的內存操作數形式可讓您覆蓋默認DS段。 (該STOS指令使用ES段不能覆蓋。)因此,例如,你可以這樣做:

rep outs dx, WORD PTR fs:[esi] 
+2

不僅可以覆蓋默認段,而且還可以使用具有「67」前綴的地址大小,以便給我們例如在32位模式下使用'stos dword [es:di]'。 – Ruslan