2013年9月21日 星期六

x86 machine code 初探 (5) - 兩個 modrm base/index with scale factor address mode

modrm 的 r/m:100 時, 這是一個特殊的記號, 代表下一個 byte 又是一個 modrm, 不過目前被稱為 SIB 欄位。Programming THE 80386 p71 稱這是 two-byte address mode encoding。

address_mode.S
1 # practice x86 machine code
2 #.code16
3 .code32
4 .text
5 .global begin
6 begin:
7   mov 24(%esp,%esi,8), %eax

objdump:
8b 44 f4 18 mov 0x18(%esp,%esi,8),%eax

att syntax: displacement(base, index, scale)

mov
8B  /r   MOV r16,r/m16     2/4           Move r/m word to word register
8B  /r   MOV r32,r/m32     2/4           Move r/m dword to dword register

44 -> mod reg r/m 01 000 100 reg:000 -> %eax
mod 01 表示 8bit displacement(0x18)
r/m 100, 所以下一個也是 modrm (SIB)

f4 -> mod reg r/m 11 110 100 這代表著
scale index base
11    110   100
8     %esi  %esp

若是 mode 10 表示 32 bit displacement。

ex:
8b 84 f4 32 54 76 98     mov    -0x6789abce(%esp,%esi,8),%eax
44 -> 84
od reg r/m 10 000 100

解說完畢。

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。