|
@@ -0,0 +1,25 @@
|
|
|
+*Concepts you may want to Google beforehand: segmentation*
|
|
|
+
|
|
|
+**Goal: learn how to address memory with 16-bit real mode segmentation**
|
|
|
+
|
|
|
+If you are comfortable with segmentation, skip this lesson.
|
|
|
+
|
|
|
+We did segmentation
|
|
|
+with `[org]` on lesson 3. Segmentation means that you can specify
|
|
|
+an offset to all the data you refer to.
|
|
|
+
|
|
|
+This is done by using special registers: `cs`, `ds`, `ss` and `es`, for
|
|
|
+Code, Data, Stack and Extra (i.e. user-defined)
|
|
|
+
|
|
|
+Beware: they are *implicitly* used by the CPU, so once you set some
|
|
|
+value for, say, `ds`, then all your memory access will be offset by `ds`.
|
|
|
+[Read more here](http://wiki.osdev.org/Segmentation)
|
|
|
+
|
|
|
+Furthermore, to compute the real address we don't just join the two
|
|
|
+addresses, but we *overlap* them: `segment << 4 + address`. For example,
|
|
|
+if `ds` is `0x4d`, then `[0x20]` actually refers to `0x4d0 + 0x20 = 0x4f0`
|
|
|
+
|
|
|
+Enough theory. Have a look at the code and play with it a bit.
|
|
|
+
|
|
|
+Hint: We cannot `mov` literals to those registers, we have to
|
|
|
+use a general purpose register before.
|