objdump -d a.out の <main>セクションの一番最初は、
push %rbp → 0x55 となっていました。
binutilsのopcodesの中に、ニーモニックとレジストリの値の一覧を探しました。
// ニーモニック { "push", 1, 0x50, None, 1, { "push", 1, 0xff, 0x6, 1, { "push", 1, 0x6a, None, 1, { "push", 1, 0x68, None, 1, { "push", 1, 0x6, None, 1, { "push", 1, 0xfa0, None, 2, { "push", 1, 0x50, None, 1, { "push", 1, 0xff, 0x6, 1, { "push", 1, 0x6a, None, 1, { "push", 1, 0x68, None, 1, { "push", 1, 0xfa0, None, 2, { "pusha", 0, 0x60, None, 1, { "pushf", 0, 0x9c, None, 1, { "pushf", 0, 0x9c, None, 1,
レジストリに関して、、、
static const char *intel_names64[] = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" };
rbx, Reg64|BaseIndex, 0, 3, Dw2Inval, 3 rsp, Reg64, 0, 4, Dw2Inval, 7 rbp, Reg64|BaseIndex, 0, 5, Dw2Inval, 6 rsi, Reg64|BaseIndex, 0, 6, Dw2Inval, 4 rdi, Reg64|BaseIndex, 0, 7, Dw2Inval, 5
{ "rbp", { { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, 0, 5, { Dw2Inval, 6 } },
push命令だけではなく、オペランドをくっつけたときにバイナリコードになりますが・・・
#どのような手順で計算すれば、push + %rbp が, 16進数で0x55となるのでしょうか?
やり方を知っている方はぜひ教えてください。
Linux 64bit です。
[追記]
printf("you will make me happy!!\n");
をアセンブルすると、 mov $0x4005a4,%edi
you will make me happy!! という文字列が逆順に入っているのは、「リトルエンディアンだから」という理由でしょうか?
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/09 01:29 編集
2017/05/09 03:28
2017/05/09 03:54
2017/05/09 04:26 編集
2017/05/09 04:26
2017/05/09 04:35
2017/05/09 04:47
2017/05/09 04:52
2017/05/09 04:56
2017/05/09 05:00
2017/05/09 05:14 編集
2017/05/09 05:14