2018年2月23日 星期五

x86 machine code 初探 (8) - mov +rd

我邁進到組譯器階段了, 第一個難關便是如何產生 x86 machine code, 連最簡單的 mov 都難倒我。人腦找資料看懂這些數字都不容易了, 而要讓電腦將組合語言轉成 machine code 更讓我不知所措。

env:
x86 32bit mode

list 1.
b8 01 00 00 00          mov    $0x1,%eax
bb 01 00 00 00          mov    $0x1,%ebx

天阿! 這魔法般的數字是怎麼來的。

x86 Instruction Set Reference mov 找到這些規則。

list 2.
1 B8+rd  MOV r32,imm32   Move imm32 to r32.
2 C7/0 MOV r/m32,imm32 Move imm32 to r/m32.

mov 有很多格式, list 1. 的指令是對應到 list 2. rd 這種格式, 但我覺得第二種格式應該也可以。

table 1. register table
REGRegister
000EAX/AX
001ECX/CX
010EDX/DX
011EBX/BX
100ESP/SP
101EBP/BP
110ESI/SI
111EDI/DI

b8, bb 的數字是怎麼來的呢?

b8 => 1011 1000
紅色的 000 就是 table 1 要填入的 register value, eax 是 000, 所以得到 => 1011 1000 (b8)
ebx 是 101, 所以得到 => 1011 1101 (bb)

後面的 01000000 就是 $0x1。

沒有留言:

張貼留言

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

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