2016-04-29 2 views
2

В справочной системе набора инструкций IA-32, STOS/STOSB/STOSW/STOSD, в чем разница между инструкцией stos m32 и stosd, не являются ли они их описанием одинаковыми?
И какова функция m32? Когда мы используем инструкцию, мы должны установить eax и es, edi, действует ли операнд m32?Сборка: какая разница между `stos m32` и` stosd` мнемоника?

+0

Может показаться странным, но с использованием КСН с операндом памяти позволяет ассемблеру использовать ** размер ** операнда памяти (байт, слово, слово), чтобы определить, следует ли его кодировать как STOSB, STOSW, STOSD. –

+0

Затем используется ли операнд 'm32' или нет, он просто используется для определения размера операнда памяти, поэтому мы можем произвольно выбирать операнд' m32', если размер правильный. @MichaelPetch – zhenguoli

+0

Используется исключительно для размера. То, на что оно указывает, игнорируется. Большинство разработчиков, которых я знаю, используют STOSB, STOSW, STOSD. Исключением является использование _MASM_. В этой среде, когда вы объявляете переменную, MASM отслеживает тип переменных. Конечный результат тот же, хотя - только размер используется. –

ответ

2

STOS m32 Форма и форма STOSD - это два разных способа выражения одной и той же инструкции. Возможно, вы заметили, что за пределами новых инструкций SIMD (SSE, AVX и т. Д.) Большинство ячеек команд не имеют суффикса, указывающего размер выполняемой операции. Например, нет инструкции INCD или MOVW. Вместо этого размер операндов определяет размер операции. Форма STOS m32 позволяет этой инструкции соответствовать этому соглашению.

В MASM это позволяет код, как следующий, когда размер инструкции КСН зависит от типа (размера) символа:

array DW 30 DUP (?) 

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

Изменение DW для DD и код будет заполнить массив двойных слов с 1s вместо этого массив WORD. Обратите внимание, что используется только размер операнда памяти. Инструкция по-прежнему записывается на адрес, указанный EDI.

Хотя он не применяется к STOS, формы операндов памяти некоторых других строковых команд позволяют вам переопределить сегмент DS по умолчанию. (Инструкция STOS использует сегмент ES, который не может быть преодолено.) Так, например, вы можете сделать:

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

Не только сегмент по умолчанию можно переопределить, но и размер адреса с префиксом '67', чтобы дать нам, например. 'stos dword [es: di]' в 32-битном режиме. – Ruslan

Смежные вопросы