Байт SIB
Кто-нибудь знает, что такое байт SIB в команде (байт, ставящийся после MODR/M при 32 адресации), и с чем его едят???
add eax,[ecx*8]
здесь ss=8=11b (1=00b,2=01b,4=10b,8=11b)
затем идут 3 байта поля index, которые означают на что мы будем домножать scale. В данном случае - это ecx. А база используется для прибавления, например
add eax,[ecx*8+ebx], где ebx - это база.
По исходной операции не сложно восстановить и сам байт sib. Надо только знать какие тройки бит соответствуют регистрам и просто построить исходный байт. (eax=000,ecx=001,edx=010,ebx=011...)
В последнем случае SIB=(11)(011)(001)
add eax,[ecx*8]
здесь ss=8=11b (1=00b,2=01b,4=10b,8=11b)
затем идут 3 байта поля index, которые означают на что мы будем домножать scale. В данном случае - это ecx. А база используется для прибавления, например
add eax,[ecx*8+ebx], где ebx - это база.
По исходной операции не сложно восстановить и сам байт sib. Надо только знать какие тройки бит соответствуют регистрам и просто построить исходный байт. (eax=000,ecx=001,edx=010,ebx=011...)
В последнем случае SIB=(11)(011)(001)
Принцип понял.
1. Байт sib добавляется, если в основном постбайте поле r/m=100 (что соответствует регистру esp). Таким образом, например,
постбайт 00.001.100 обозначает не
"ecx, [esp]", а "ecx, (sib)".
2. Указатель стека не может быть также и индексом (index = 100 в байте sib). То есть,
например, sib = 11.011.100 обозначает не [ebx+8*esp], а просто [ebx].
3. Если в байте sib base = 101 (регистр ebp),
а в предыдущем байте mod = 00, то вместо ebp
используется 32-разрядное смещение. То есть
01.011.100 11.101.001 - ebx, d8[ebp+8*ecx]
10.011.100 11.101.001 - ebx, d32[ebp+8*ecx]
00.011.100 11.101.001 - ebx, d32[8*ecx], а не
ebx, [ebp+8*ecx].