x86 asm: mov

This commit is contained in:
Ciro Santilli 六四事件 法轮功
2019-06-03 00:00:00 +00:00
parent 39de6f6abf
commit 47b39a84c9
2 changed files with 52 additions and 26 deletions

View File

@@ -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: <<qemu-user-mode-getting-started>>.
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/<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
** <<arm-mov-instruction>>
** 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: <<userland-assembly>>.
=== 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 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: <<simd-assembly>>
====== x86 paddq instruction
===== x86 paddq instruction
link:userland/arch/x86_64/paddq.S[]: `paddq`, `paddl`, `paddw`, `paddb`

View File

@@ -0,0 +1,37 @@
/* https://github.com/cirosantilli/linux-kernel-module-cheat#userland-assembly */
#include <lkmc.h>
.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