Files
x86-bare-metal-examples/segmentation.S
2019-07-19 00:00:00 +00:00

65 lines
1.5 KiB
ArmAsm

/* https://github.com/cirosantilli/x86-bare-metal-examples#protected-mode-segmentation */
#include "common.h"
BEGIN
CLEAR
STAGE2
PROTECTED_MODE
/* Sanity check 1: just print the output. */
VGA_PRINT_STRING $output
/* Sanity check 2: make a mov without any segment manipulation. */
mov message, %cl
mov %cl, output
VGA_PRINT_STRING $output
/* Now for the real action. */
mov $gdt_data, %edx
/* We are touching the 7th byte of the data entry. */
add $3, %edx
mov (%edx), %al
/* Cache it for later. */
mov %al, %bl
/* Set the first bit of the descriptor memory. */
xor $1, %al
mov %al, (%edx)
/* We must re-set ds because the segment descriptor is cached
* and this updates it:
* http://wiki.osdev.org/Descriptor_Cache
*/
mov $DATA_SEG, %ax
mov %ax, %ds
/* This is the only memory access we will make with
* the modified segment, to minimize the effect on our IO.
*/
mov message, %cl
/* Restore the old segment. */
/* TODO is this needed to take into account the new segmentation? */
dec %edx
mov %bl, (%edx)
mov %ax, %ds
/* TODO this sanity check is not printing "ab".
* It fails, so we're not restoring the old state properly.
* Maybe blows up because video memory going wrong?
*/
VGA_PRINT_STRING $message
mov %cl, output
VGA_PRINT_STRING $output
hlt
message:
.asciz "ab"
output:
.asciz "x"