From 90925e7e06cab05db39b5ad277135bd14050043b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciro=20Santilli=20=E5=85=AD=E5=9B=9B=E4=BA=8B=E4=BB=B6=20?= =?UTF-8?q?=E6=B3=95=E8=BD=AE=E5=8A=9F?= Date: Mon, 10 Jun 2019 00:00:00 +0000 Subject: [PATCH] x86 asm: make add awesome --- userland/arch/x86_64/add.S | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/userland/arch/x86_64/add.S b/userland/arch/x86_64/add.S index 2c309e7..31193b9 100644 --- a/userland/arch/x86_64/add.S +++ b/userland/arch/x86_64/add.S @@ -3,7 +3,43 @@ #include LKMC_PROLOGUE + /* Register immediate. */ mov $1, %rax add $2, %rax LKMC_ASSERT_EQ(%rax, $3) + + /* Register register. */ + mov $1, %rax + mov $2, %rbx + add %rbx, %rax + LKMC_ASSERT_EQ(%rax, $3) + + /* Memory and immediate. */ +.data + memory_immediate: .quad 0x123456789ABCDEF0 +.text + addq $1, memory_immediate + LKMC_ASSERT_EQ(memory_immediate, $0x123456789ABCDEF1) + + /* Memory and register. */ +.data + memory_register: .quad 0x123456789ABCDEF0 +.text + mov $1, %rax + add %rax, memory_register + LKMC_ASSERT_EQ(memory_register, $0x123456789ABCDEF1) + +#if 0 + /* Cannot do different register sizes: + * Error: operand type mismatch for for `add' + */ + add %rax, %eax +#endif + +#if 0 + /* Cannot do memory memory. + * Error: too many memory references for `add' + */ + addq memory_immediate, memory_register +#endif LKMC_EPILOGUE