forked from cirosantilli/linux-kernel-module-cheat
/
stos.S
62 lines (47 loc) · 1.28 KB
/
stos.S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* https://cirosantilli.com/linux-kernel-module-cheat#x86-string-instructions */
#include <lkmc.h>
.data
my_quad_array: .quad 0, 0
my_quad_array_expect_forward: .quad 1, 2
my_quad_array_expect_backwards: .quad 4, 3
LKMC_PROLOGUE
/* Clear the direction flag: move forward. */
cld
/* The target address is stored in RDI. */
lea my_quad_array(%rip), %rdi
/* my_quad_array[0] = 1 */
mov $1, %rax
/* RAX is automatically used as the source. */
stosq
/* my_quad_array[1] = 2 */
mov $2, %rax
stosq
/* RDI moved 2x 8 bytes forward. */
sub $my_quad_array, %rdi
LKMC_ASSERT_EQ(%rdi, $0x10)
/* The memory was modified. */
LKMC_ASSERT_MEMCMP(
my_quad_array,
my_quad_array_expect_forward,
$0x10
)
/* Now with backwards direction. */
std
/* The target address is stored in RDI. */
lea (my_quad_array + 8)(%rip), %rdi
/* my_quad_array[1] = 3 */
mov $3, %rax
stosq
/* my_quad_array[0] = 4 */
mov $4, %rax
stosq
/* RDI moved 2x 8 bytes backwards. */
sub $my_quad_array, %rdi
LKMC_ASSERT_EQ(%rdi, $-0x8)
/* The memory was modified. */
LKMC_ASSERT_MEMCMP(
my_quad_array,
my_quad_array_expect_backwards,
$0x10
)
LKMC_EPILOGUE