IDM говорит, что память op использует сегмент SS, если EBP используется в качестве базового регистра. В результате [ebp + esi]
и [esi + ebp]
ссылаются на сегменты SS и DS соответственно. См. Документ NASM: 3.3. Эффективный адрес.
В том же разделе NASM упомянул, как создать более короткий машинный код, заменив [eax*2]
на [eax+eax]
.
Однако NASM также генерирует [ebp + ebp]
для [ebp*2]
(т.е. Нет базового регистра).
Я подозреваю, что [ebp+ebp]
ссылается на сегмент SS, а [ebp*2]
ссылается на сегмент DS.
Я задал NASM этот вопрос. Они думают, что [ebp*2]
и [ebp+ebp]
одинаковы, но для меня это не имеет смысла. Очевидно, что [ebp+ebp]
(ebp в качестве базового регистра) ссылается на сегмент SS. Если они совпадают, [ebp*2
должен ссылаться на SS. Это означает, что SS ссылается до тех пор, пока ebp
является базовым или индексным регистром, который, в свою очередь, означает, что оба сегмента [ebp + esi]
и [esi + ebp]
ссылаются на SS, поэтому они должны быть одинаковыми.
Кто-нибудь знает, какой сегмент [ebp*2]
использует?