diff --git a/README.adoc b/README.adoc index 26d8fb0..cbfe67b 100644 --- a/README.adoc +++ b/README.adoc @@ -11742,23 +11742,20 @@ As a quick reminder, the fastest setups to get started are: However, as usual, it is saner to build your toolchain as explained at: <>. -The first example that you want to run for each arch is: +The first examples that you want to run for each arch are: -.... -./run --userland userland/arch//add.S -.... +* how to move data between registers and memory +* how to add two numbers! -e.g.: +These examples are located at: -.... -./run --userland userland/arch/x86_64/add.S -.... - -Sources: - -* link:userland/arch/x86_64/add.S[] -* link:userland/arch/arm/add.S[] -* link:userland/arch/aarch64/add.S[] +* x86 +** link:userland/arch/x86_64/add.S[] +** link:userland/arch/x86_64/mov.S[] +* arm +** <> +** link:userland/arch/arm/add.S[] +** link:userland/arch/aarch64/add.S[] These examples use the venerable ADD instruction to: @@ -12288,15 +12285,7 @@ Bibliography: https://stackoverflow.com/questions/27147043/n-suffix-to-branch-in Arch agnostic infrastructure getting started at: <>. -=== x86 userland assembly getting started - -These are the main concepts and instructions that you should learn to be able to understand what is going on. - -Once those are done, everything else left on userland is just to learn a huge list of instructions: <> - -=== x86 userland assembly instructions - -==== x86 SIMD +=== x86 SIMD History: @@ -12309,15 +12298,15 @@ History: * AVX2:2013 * AVX-512: 2016. 512-bit ZMM registers. Extension of YMM. -===== x86 SSE2 +==== x86 SSE2 -====== x86 addpd instruction +===== x86 addpd instruction link:userland/arch/x86_64/addpd.S[]: `addps`, `addpd` Good first instruction to learn SIMD: <> -====== x86 paddq instruction +===== x86 paddq instruction link:userland/arch/x86_64/paddq.S[]: `paddq`, `paddl`, `paddw`, `paddb` diff --git a/userland/arch/x86_64/mov.S b/userland/arch/x86_64/mov.S new file mode 100644 index 0000000..f25b143 --- /dev/null +++ b/userland/arch/x86_64/mov.S @@ -0,0 +1,37 @@ +/* https://github.com/cirosantilli/linux-kernel-module-cheat#userland-assembly */ + +#include + +.data + myint: .long 0x12345678 +LKMC_PROLOGUE + /* Immediate and register. */ + mov $0, %rax + mov $1, %rax + LKMC_ASSERT_EQ(%rax, $1) + + /* Register and register. */ + mov $0, %rax + mov $1, %rbx + mov %rbx, %rax + LKMC_ASSERT_EQ(%rax, $1) + + /* Memory and register. */ + mov myint, %rax + LKMC_ASSERT_EQ(%rax, $0x12345678) + + /* Memory and immediate. */ + movl $0x9ABCDEF0, myint + LKMC_ASSERT_EQ(myint, $0x9ABCDEF0) + + /* Memory via pointer to address. */ + /* eax = &myint */ + mov $myint, %rax + movl $0x11112222, (%rax) + LKMC_ASSERT_EQ(myint, $0x11112222) + + /* Possible to move on itself, seems like a NOP and way to clear 32 high bits in x86-64: + * http://stackoverflow.com/questions/11910501/why-did-gcc-generate-mov-eax-eax-and-what-does-it-mean + */ + mov %rax, %rax +LKMC_EPILOGUE