-
Notifications
You must be signed in to change notification settings - Fork 120
/
registers.asm
162 lines (100 loc) · 4.58 KB
/
registers.asm
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
; Intel puts the registers in the following groups:
; - General-purpose registers
; - Segment registers
; - EFLAGS (program status and control) register
%include "lib/common_nasm.inc"
ENTRY
; # General purpose registers
; # ebp
; Stack base.
; Why it exists:
; http://stackoverflow.com/questions/579262/what-is-the-purpose-of-the-ebp-frame-pointer-register
; - tell the debugger where the current frame starts
; - facilitate VLA and alloca
; Modified by `enter` and `leave`.
; You can almost never use it as a general purpose register because of that.
; It's usage on high level languages can be optimized away
; e.g. with `-fomit-frame-pointer` in GCC 4.8.
; # esp
; Stack Pointer.
; Notably modified by `push`, `pop`, `enter`, `leave`, `call` and `ret`.
; You can almost never use it as a general purpose register because of that.
; # eip
; Instruction Pointer.
; Address of the current instruction to be executed.
; Cannot be retrieved directly: `mov` cannot be encoded to output to EIP:
; http://stackoverflow.com/questions/599968/reading-program-counter-directly
; There are however indirect techniques, and NASM offers `$`.
; # pc
; Another name for the IP.
; https://en.wikipedia.org/wiki/Program_counter
; # Initial register state
; Finally, no more programming languages getting in our way with definite assignment:
; - http://stackoverflow.com/questions/1802783/initial-state-of-program-registers-and-stack-on-linux-arm
; - http://stackoverflow.com/questions/9147455/what-is-default-register-state-when-program-launches-asm-linux
; Mentioned on major ABI specs, e.g. AMD64: http://www.x86-64.org/documentation/abi-0.99.pdf
; # Flag registers and instructions
; Most flag are identified by one letter, and commonly denoted `XF` for "flag X".
; Flags may be set or reset explicitly by dedicated instructions,
; and also as side effects of other instructions, e.g. `cmp` for ZF and CF.
; The flags are:
; - Type: Name (Identifier)
; - X: ID Flag (ID)
; - X: Virtual Interrupt Pending (VIP)
; - X: Virtual Interrupt Flag (VIF)
; - X: Alignment Check / Access Control (AC)
; - X: Virtual-8086 Mode (VM)
; - X: Resume Flag (RF)
; - X: Nested Task (NT)
; - X: I/O Privilege Level (IOPL)
; - S: Overflow Flag (OF)
; - C: Direction Flag (DF)
; - X: Interrupt Enable Flag (IF)
; - X: Trap Flag (TF)
; - S: Sign Flag (SF)
; - S: Zero Flag (ZF)
; - S: Auxiliary Carry Flag (AF)
; - S: Parity Flag (PF)
; - S: Carry Flag (CF)
; The types are:
; - `S`: Status Flag. Has no side effects.
; - `C`: Control Flag. Has side effects.
; - `X`: System Flag. Should not be modified from applications, only OS.
; The bit number of each flag is fixed.
; All the non-used are reserved for future use.
; # FLAGS
; 16-bit register that contains bit flags.
; Same as the lower bits of EFLAGS, which was added later.
; # EFLAGS
; 32-bit register that contains bit flags. TODO: added in x86-64?
; Lower 32 bits of RFLAGS.
; # RFLAGS
; 64-bit register that contains bit flags. Added in x86-64.
; TODO check: none of the new flags are used so far.
; # How to read and write flags
; http://stackoverflow.com/questions/1406783/flags-registers-can-we-read-or-write-them-directly
; - for a few flags: `jxx`
; - for the 8 lower bits: `lahf` and `sahf`
; - for all others: `pushf` and `popf`
; # Individual flag instructions
; Some, but not all, individual flags have dedicated instructions to operate on them.
; # stc
; # sti
; # std
; Set flag X (set it to 1).
; # clc
; # cli
; # cld
; Clear flag X (set it to 0).
; # cmc
; Complement flag X (boolean negation).
; This is the only flag that has the complement instruction.
stc
ASSERT_FLAG jc
clc
ASSERT_FLAG jnc
cmc
ASSERT_FLAG jc
cmc
ASSERT_FLAG jnc
EXIT