mirror of
https://github.com/Ed94/bare_x86.git
synced 2024-12-26 08:54:46 -08:00
initial commit
This commit is contained in:
commit
7a6799d2c7
36
.editorconfig
Normal file
36
.editorconfig
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
guidelines = 160
|
||||||
|
|
||||||
|
[*{.h, .c}]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
guidelines = 160
|
||||||
|
|
||||||
|
[*{.low.h, .low.c]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 8
|
||||||
|
guidelines = 80
|
||||||
|
|
||||||
|
[*{.hpp, cpp}]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
guidelines = 160
|
||||||
|
|
||||||
|
[*{.low.hpp, .low.cpp}]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 8
|
||||||
|
guidelines = 80
|
||||||
|
|
||||||
|
[*{.py}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
guidelines = 180
|
||||||
|
|
||||||
|
[*[.s]]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 8
|
||||||
|
guidelines = 80
|
0
.gitignore
vendored
Normal file
0
.gitignore
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"editor.rulers": [
|
||||||
|
110,
|
||||||
|
],
|
||||||
|
"editor.cursorStyle": "block-outline"
|
||||||
|
}
|
BIN
0.Hello/16bit.hello.TextModeBuff.hex
Normal file
BIN
0.Hello/16bit.hello.TextModeBuff.hex
Normal file
Binary file not shown.
164
0.Hello/16bit.hello.TextModeBuff.hex.s
Normal file
164
0.Hello/16bit.hello.TextModeBuff.hex.s
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
; Print HEx
|
||||||
|
|
||||||
|
; x86
|
||||||
|
; 16-bit - Real Mode, V86 Mode
|
||||||
|
|
||||||
|
; https://codereview.stackexchange.com/questions/230755/display-hexadecimal-value-stored-at-a-register
|
||||||
|
|
||||||
|
|
||||||
|
%include "AAL.x86.S"
|
||||||
|
|
||||||
|
|
||||||
|
; 16-Bit Mode
|
||||||
|
[BITS 16]
|
||||||
|
; The ORG directive specifies the starting address of a segment
|
||||||
|
[ORG Mem_BootSector_Start]
|
||||||
|
|
||||||
|
|
||||||
|
start:
|
||||||
|
mov BX, Mem_BootSector_Start
|
||||||
|
|
||||||
|
; textmode_ClearScreen
|
||||||
|
; Params
|
||||||
|
mov AH, Video_SetMode
|
||||||
|
mov AL, VideoMode_Text_80x25
|
||||||
|
; Call Interrupt
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
; Exclusive-OR (xor'ing a value to itself zeros the value)
|
||||||
|
xor AX, AX
|
||||||
|
; Set Data Segment and Extra Segment to 0x0000
|
||||||
|
mov DS, AX
|
||||||
|
mov ES, AX
|
||||||
|
; Set Stack Segment (SS) to to 0x0000
|
||||||
|
mov SS, AX
|
||||||
|
; Set Stack Pointer (SP) to the start of the boot sector.
|
||||||
|
mov SP, BX
|
||||||
|
|
||||||
|
mov BX, 0x2022
|
||||||
|
call output_Hex
|
||||||
|
|
||||||
|
; Idle
|
||||||
|
hang :
|
||||||
|
jmp short hang
|
||||||
|
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Output Hex to TextMode via Teletype
|
||||||
|
;=============================================================================================================
|
||||||
|
%define hex BX
|
||||||
|
%define backup CX
|
||||||
|
|
||||||
|
output_Hex:
|
||||||
|
; Clear Interrupt Flag : Prevents interrupts form occuring
|
||||||
|
cli
|
||||||
|
; Push all registers values onto the stack
|
||||||
|
pusha
|
||||||
|
|
||||||
|
; Store original value in backup
|
||||||
|
mov backup, hex
|
||||||
|
; Setup referfence to hex chars memory
|
||||||
|
mov SI, .CharHex
|
||||||
|
|
||||||
|
; Shift Logical Right : SHR performs an unsigned divide
|
||||||
|
; The high-order bit is set to 0.
|
||||||
|
; 0b1000 -> 0b0100, 0b0001 -> 0b0000
|
||||||
|
shr hex, 12 ; First four : 0x[#]### -> 0x000#
|
||||||
|
and hex, 0x0F ; Mask out any garbage
|
||||||
|
mov AL, [hex + SI] ; AL = hex + SI
|
||||||
|
mov [.Result + 2], AL ; result[2] = AL
|
||||||
|
|
||||||
|
mov hex, backup ; Next four
|
||||||
|
shr hex, 8
|
||||||
|
and hex, 0x0F
|
||||||
|
mov AL, [hex + SI]
|
||||||
|
mov [.Result + 3], AL
|
||||||
|
|
||||||
|
mov hex, backup ; ...
|
||||||
|
shr hex, 4
|
||||||
|
and hex, 0x0F
|
||||||
|
mov AL, [hex + SI]
|
||||||
|
mov [.Result + 4], AL
|
||||||
|
|
||||||
|
mov hex, backup
|
||||||
|
shr hex, 0
|
||||||
|
and hex, 0x0F
|
||||||
|
mov AL, [hex + SI]
|
||||||
|
mov [.Result + 5], AL
|
||||||
|
|
||||||
|
; BX : String arg
|
||||||
|
mov CX, .Result
|
||||||
|
call output_String
|
||||||
|
|
||||||
|
; Pop all register values that were saved on the current stack
|
||||||
|
popa
|
||||||
|
; Set Interrupt Flag : Restore interrupts
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Proc Data
|
||||||
|
.CharHex:
|
||||||
|
db '0123456789ABCDEF', 0x0
|
||||||
|
|
||||||
|
.Result:
|
||||||
|
db '0x0000', 0x0
|
||||||
|
|
||||||
|
%undef hex
|
||||||
|
%undef backup
|
||||||
|
%unmacro index 1
|
||||||
|
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Output String to TextMode via Teletype
|
||||||
|
;=============================================================================================================
|
||||||
|
%define string CX
|
||||||
|
%define CharHex_Length 6
|
||||||
|
%macro TextMode_SetChar 2
|
||||||
|
mov word [%1 * 2 ], %2
|
||||||
|
mov word [%1 * 2 + 1], 0x0F
|
||||||
|
%endmacro
|
||||||
|
output_String:
|
||||||
|
pusha
|
||||||
|
; Will track string index
|
||||||
|
mov SI, 0x0
|
||||||
|
|
||||||
|
; Prep BH and AH with Teletype video service option
|
||||||
|
mov BH, 0x0
|
||||||
|
mov AH, Video_TeleType
|
||||||
|
|
||||||
|
; Reg CX cannot be used as an index speciifer. [BX] is
|
||||||
|
; SI can be used as an offset inside [BX + offset]
|
||||||
|
mov BX, CX
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
; Compare
|
||||||
|
cmp SI, CharHex_Length
|
||||||
|
je .break
|
||||||
|
; Jump
|
||||||
|
|
||||||
|
; Print via teletype
|
||||||
|
mov AL, [BX + SI];
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
; Increment index
|
||||||
|
inc SI
|
||||||
|
jmp short .loop
|
||||||
|
|
||||||
|
.break:
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
%undef string
|
||||||
|
%undef index
|
||||||
|
%undef CharHex_Length
|
||||||
|
%unmacro TextMode_SetChar 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Wrap up
|
||||||
|
;=============================================================================================================
|
||||||
|
; Byte pad 512 bytes (zeroed)
|
||||||
|
times 510-$+start db 0
|
||||||
|
; Master Boot Record signature
|
||||||
|
db 0x55
|
||||||
|
db 0xAA
|
58
0.Hello/16bit.hello.char.TextModeBuff.s
Normal file
58
0.Hello/16bit.hello.char.TextModeBuff.s
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
; Hello world.
|
||||||
|
|
||||||
|
; x86
|
||||||
|
; 16-bit - Real Mode, V86 Mode
|
||||||
|
|
||||||
|
%include "AAL.x86.S"
|
||||||
|
|
||||||
|
|
||||||
|
; 16-Bit Mode
|
||||||
|
[BITS 16]
|
||||||
|
; The ORG directive specifies the starting address of a segment
|
||||||
|
[ORG Mem_BootSector_Start]
|
||||||
|
|
||||||
|
|
||||||
|
; A label to the address in memory
|
||||||
|
; Auto calculated by the assembler
|
||||||
|
start :
|
||||||
|
|
||||||
|
textmode_ClearScreen :
|
||||||
|
; Params
|
||||||
|
mov AH, Video_SetMode
|
||||||
|
mov AL, VideoMode_Text_80x25
|
||||||
|
; Call Interrupt
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
; Set Data segment to the text mode's memory buffer
|
||||||
|
mov AX, Video_Text_MemBuffer
|
||||||
|
mov DS, AX
|
||||||
|
|
||||||
|
%macro SetChar 2
|
||||||
|
; word : 16-bit (2-byte) increments
|
||||||
|
; [offset] : specifies offset in Data Segment (DS)
|
||||||
|
; Character
|
||||||
|
mov word [%1 * 2 ], %2
|
||||||
|
; Attributes - Low: Black, High: White
|
||||||
|
mov word [%1 * 2 + 1], 0x0F
|
||||||
|
%endmacro
|
||||||
|
SetChar 0x00, 'H'
|
||||||
|
SetChar 0x01, 'e'
|
||||||
|
SetChar 0x02, 'l'
|
||||||
|
SetChar 0x03, 'l'
|
||||||
|
SetChar 0x04, 'o'
|
||||||
|
SetChar 0x05, ' '
|
||||||
|
SetChar 0x06, 'W'
|
||||||
|
SetChar 0x07, 'o'
|
||||||
|
SetChar 0x08, 'r'
|
||||||
|
SetChar 0x09, 'l'
|
||||||
|
SetChar 0x0A, 'd'
|
||||||
|
|
||||||
|
hang :
|
||||||
|
jmp short hang
|
||||||
|
|
||||||
|
|
||||||
|
; Byte pad 512 bytes (zeroed)
|
||||||
|
times 510-$+start db 0
|
||||||
|
; Master Boot Record signature
|
||||||
|
db 0x55
|
||||||
|
db 0xAA
|
60
0.Hello/16bit.hello.char.teletype.s
Normal file
60
0.Hello/16bit.hello.char.teletype.s
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
; Hello world.
|
||||||
|
|
||||||
|
; x86
|
||||||
|
; 16-bit - Real Mode, V86 Mode
|
||||||
|
|
||||||
|
%include "AAL.x86.S"
|
||||||
|
|
||||||
|
|
||||||
|
; 16-Bit Mode
|
||||||
|
[BITS 16]
|
||||||
|
; The ORG directive specifies the starting address of a segment
|
||||||
|
[ORG Mem_BootSector_Start]
|
||||||
|
|
||||||
|
|
||||||
|
start :
|
||||||
|
|
||||||
|
textmode_ClearScreen:
|
||||||
|
; Params
|
||||||
|
mov AH, Video_SetMode
|
||||||
|
mov AL, VideoMode_Text_40x25
|
||||||
|
; Call Interrupt
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
teletype_HelloWorld :
|
||||||
|
mov BH, 0x0 ; Make sure the Active page is the first
|
||||||
|
mov AH, Video_TeleType
|
||||||
|
mov AL, 'H'
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'e'
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'l'
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'l'
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'l'
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'o'
|
||||||
|
int VideoService
|
||||||
|
mov AL, ' '
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'W'
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'o'
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'r'
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'l'
|
||||||
|
int VideoService
|
||||||
|
mov AL, 'd'
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
hang :
|
||||||
|
jmp short hang
|
||||||
|
|
||||||
|
|
||||||
|
; Byte pad 512 bytes (zeroed)
|
||||||
|
times 510-$+start db 0
|
||||||
|
; Master Boot Record signature
|
||||||
|
db 0x55
|
||||||
|
db 0xAA
|
349
0.Hello/AAL.x86.s
Normal file
349
0.Hello/AAL.x86.s
Normal file
@ -0,0 +1,349 @@
|
|||||||
|
;=============================================================================================================
|
||||||
|
;=============================================================================================================
|
||||||
|
;=============================================================================================================
|
||||||
|
; AAL - Assembly Abstraction layer
|
||||||
|
; x86-64
|
||||||
|
; Provides a suite of docs, functionatliy, macros, etc.
|
||||||
|
;
|
||||||
|
; Made while learning x86
|
||||||
|
; Edward R. Gonzalez
|
||||||
|
;=============================================================================================================
|
||||||
|
;=============================================================================================================
|
||||||
|
;=============================================================================================================
|
||||||
|
;
|
||||||
|
; See
|
||||||
|
; https://en.wikibooks.org/wiki/X86_Assembly/16,_32,_and_64_Bits
|
||||||
|
; https://wiki.osdev.org/X86-64
|
||||||
|
; http://www.ctyme.com/rbrown.htm
|
||||||
|
; https://github.com/Captainarash/The_Holy_Book_of_X86/blob/master/book_vol_1.txt
|
||||||
|
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Calling Convention
|
||||||
|
;=============================================================================================================
|
||||||
|
; Calling convention - Caller/Callee Saved Registers
|
||||||
|
;
|
||||||
|
; Caller rules: When calling a function the registers
|
||||||
|
; RAX, RCX, RDX, R8, R9, R10, R11 are considered volatile and must be saved into the stack
|
||||||
|
; by the caller, if it relies on them
|
||||||
|
; (unless otherwise safety-provable by analysis such as whole program optimization).
|
||||||
|
;
|
||||||
|
; Callee rules:
|
||||||
|
; RBX, RBP, RDI, RSI, RSP, R12, R13, R14, and R15
|
||||||
|
; are considered nonvolatile and must be saved and restored from the stack by the callee if it modify them.
|
||||||
|
;=============================================================================================================
|
||||||
|
; END OF CALLING CONVENTION
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Register Documentation
|
||||||
|
;=============================================================================================================
|
||||||
|
; General Purpose
|
||||||
|
; 8 High Low 16 32 64 Intended Purpose
|
||||||
|
; AH AL AX EAX RAX Accumulator
|
||||||
|
; BH BL BX EBX RBX Base
|
||||||
|
; CH CL CX ECX RCX Counter
|
||||||
|
; DH DL DX EDX RDX Data (Used to extend the A register)
|
||||||
|
; SIL SI ESI RSI Source index for strings ops
|
||||||
|
; DIL DI EDI RDI Destination index for string operations
|
||||||
|
; SPL SPL ESP RSP Stack pointer
|
||||||
|
; BPL BP EBP RBP Base pointer (meant for stack frames)
|
||||||
|
; R8B R8W R8D R8 General Purpose (and below)
|
||||||
|
; R9B R9W R9D R9
|
||||||
|
; R10B R10W R10D R10
|
||||||
|
; R11B R11W R11D R11
|
||||||
|
; R12B R12W R12D R12
|
||||||
|
; R13B R13W R13D R13
|
||||||
|
; R14B R14W R14D R14
|
||||||
|
; R15B R15W R15D R15
|
||||||
|
; Instruction Pointer
|
||||||
|
; 16 32 64
|
||||||
|
; IP EIP RIP
|
||||||
|
; Segment
|
||||||
|
; 16
|
||||||
|
; CS Code Segment
|
||||||
|
; DS Data Segment
|
||||||
|
; SS Stack Segment
|
||||||
|
; ES Extra Segment
|
||||||
|
; FS General-purpose
|
||||||
|
; GS General-purpose
|
||||||
|
; RFLAGS
|
||||||
|
; Bit(s) Label Description
|
||||||
|
; 0 CF Carry Flag
|
||||||
|
; 1 1 Reserved
|
||||||
|
; 2 PF Parity Flag
|
||||||
|
; 3 0 Reserved
|
||||||
|
; 4 AF Auxiliary Carry Flag
|
||||||
|
; 5 0 Reserved
|
||||||
|
; 6 ZF Zero Flag
|
||||||
|
; 7 SF Sign Flag
|
||||||
|
; 8 TF Trap Flag
|
||||||
|
; 9 IF Interrupt Enable Flag
|
||||||
|
; 10 DF Direction Flag
|
||||||
|
; 11 OF Overflow Flag
|
||||||
|
; 12-13 IOPL I/O Privilege Level
|
||||||
|
; 14 NT Nested Task
|
||||||
|
; 15 0 Reserved
|
||||||
|
; 16 RF Resume Flag
|
||||||
|
; 17 VM Virtual-8086 Mode
|
||||||
|
; 18 AC Alignment Check / Access Control
|
||||||
|
; 19 VIF Virtual Interrupt Flag
|
||||||
|
; 20 VIP Virtual Interrupt Pending
|
||||||
|
; 21 ID ID Flag
|
||||||
|
; 22-63 0 Reserved
|
||||||
|
|
||||||
|
; Control
|
||||||
|
; CR0
|
||||||
|
; Bit(s) Label Description
|
||||||
|
; 0 PE Protected Mode Enable
|
||||||
|
; 1 MP Monitor Co-Processor
|
||||||
|
; 2 EM Emulation
|
||||||
|
; 3 TS Task Switched
|
||||||
|
; 4 ET Extension Type
|
||||||
|
; 5 NE Numeric Error
|
||||||
|
; 6-15 0 Reserved
|
||||||
|
; 16 WP Write Protect
|
||||||
|
; 17 0 Reserved
|
||||||
|
; 18 AM Alignment Mask
|
||||||
|
; 19-28 0 Reserved
|
||||||
|
; 29 NW Not-Write Through
|
||||||
|
; 30 CD Cache Disable
|
||||||
|
; 31 PG Paging
|
||||||
|
; 32-63 0 Reserved
|
||||||
|
; CR2
|
||||||
|
; Contains the linear (virtual) address which triggered a page fault, available in the page fault's interrupt handler.
|
||||||
|
;
|
||||||
|
; CR3
|
||||||
|
; Bit(s) Label Description Condition
|
||||||
|
; 0-11 0-2 0 Reserved CR4.PCIDE = 0
|
||||||
|
; 3 PWT Page-Level Write Through
|
||||||
|
; 5 PCD Page-Level Cache Disable
|
||||||
|
; 5-11 0 Reserved
|
||||||
|
; 0-11 PCID CR4.PCIDE = 1
|
||||||
|
; 12-63 Physical Base Address of the PML4
|
||||||
|
;
|
||||||
|
; Note that this must be page aligned
|
||||||
|
;
|
||||||
|
; CR4
|
||||||
|
; Bit(s) Label Description
|
||||||
|
; 0 VME Virtual-8086 Mode Extensions
|
||||||
|
; 1 PVI Protected Mode Virtual Interrupts
|
||||||
|
; 2 TSD Time Stamp enabled only in ring 0
|
||||||
|
; 3 DE Debugging Extensions
|
||||||
|
; 4 PSE Page Size Extension
|
||||||
|
; 5 PAE Physical Address Extension
|
||||||
|
; 6 MCE Machine Check Exception
|
||||||
|
; 7 PGE Page Global Enable
|
||||||
|
; 8 PCE Performance Monitoring Counter Enable
|
||||||
|
; 9 OSFXSR OS support for fxsave and fxrstor instructions
|
||||||
|
; 10 OSXMMEXCPT OS Support for unmasked simd floating point exceptions
|
||||||
|
; 11 UMIP User-Mode Instruction Prevention (SGDT, SIDT, SLDT, SMSW, and STR are disabled in user mode)
|
||||||
|
; 12 0 Reserved
|
||||||
|
; 13 VMXE Virtual Machine Extensions Enable
|
||||||
|
; 14 SMXE Safer Mode Extensions Enable
|
||||||
|
; 15 0 Reserved
|
||||||
|
; 17 PCIDE PCID Enable
|
||||||
|
; 18 OSXSAVE XSAVE And Processor Extended States Enable
|
||||||
|
; 19 0 Reserved
|
||||||
|
; 20 SMEP Supervisor Mode Executions Protection Enable
|
||||||
|
; 21 SMAP Supervisor Mode Access Protection Enable
|
||||||
|
; 22 PKE Enable protection keys for user-mode pages
|
||||||
|
; 23 CET Enable Control-flow Enforcement Technology
|
||||||
|
; 24 PKS Enable protection keys for supervisor-mode pages
|
||||||
|
; 25-63 0 Reserved
|
||||||
|
; CR8
|
||||||
|
; CR8 is a new register accessible in 64-bit mode using the REX prefix.
|
||||||
|
; CR8 is used to prioritize external interrupts and is referred to as the task-priority register (TPR).
|
||||||
|
;
|
||||||
|
; The AMD64 architecture allows software to define up to 15 external interrupt-priority classes.
|
||||||
|
; Priority classes are numbered from 1 to 15, with priority-class 1 being the lowest and priority-class 15 the highest.
|
||||||
|
; CR8 uses the four low-order bits for specifying a task priority and the remaining 60 bits are reserved and must be written with zeros.
|
||||||
|
;
|
||||||
|
; System software can use the TPR register to temporarily block low-priority interrupts from interrupting a high-priority task.
|
||||||
|
; This is accomplished by loading TPR with a value corresponding to the highest-priority interrupt that is to be blocked.
|
||||||
|
; For example, loading TPR with a value of 9 (1001b) blocks all interrupts with a priority class of 9 or less,
|
||||||
|
; while allowing all interrupts with a priority class of 10 or more to be recognized.
|
||||||
|
; Loading TPR with 0 enables all external interrupts. Loading TPR with 15 (1111b) disables all external interrupts.
|
||||||
|
;
|
||||||
|
; The TPR is cleared to 0 on reset.
|
||||||
|
; Bit Purpose
|
||||||
|
; 0-3 Priority
|
||||||
|
; 4-63 Reserved
|
||||||
|
; CR1, CR5-7, CR9-15
|
||||||
|
; Reserved, the cpu will throw a #ud exeption when trying to access them.
|
||||||
|
;
|
||||||
|
; CR1, CR5-7, CR9-15
|
||||||
|
; Reserved, the cpu will throw a #ud exeption when trying to access them.
|
||||||
|
;
|
||||||
|
; MSRs
|
||||||
|
;
|
||||||
|
; IA32_EFER
|
||||||
|
; Extended Feature Enable Register (EFER) is a model-specific register added in the AMD K6 processor,
|
||||||
|
; to allow enabling the SYSCALL/SYSRET instruction, and later for entering and exiting long mode.
|
||||||
|
; This register becomes architectural in AMD64 and has been adopted by Intel. Its MSR number is 0xC0000080.
|
||||||
|
;
|
||||||
|
; Bit(s) Label Description
|
||||||
|
; 0 SCE System Call Extensions
|
||||||
|
; 1-7 0 Reserved
|
||||||
|
; 8 LME Long Mode Enable
|
||||||
|
; 10 LMA Long Mode Active
|
||||||
|
; 11 NXE No-Execute Enable
|
||||||
|
; 12 SVME Secure Virtual Machine Enable
|
||||||
|
; 13 LMSLE Long Mode Segment Limit Enable
|
||||||
|
; 14 FFXSR Fast FXSAVE/FXRSTOR
|
||||||
|
; 15 TCE Translation Cache Extension
|
||||||
|
; 16-63 0 Reserved
|
||||||
|
;
|
||||||
|
; FS.base, GS.base
|
||||||
|
;
|
||||||
|
; MSRs with the addresses 0xC0000100 (for FS) and 0xC0000101 (for GS) contain the base addresses of the FS and GS segment registers.
|
||||||
|
; These are commonly used for thread-pointers in user code and CPU-local pointers in kernel code. Safe to contain anything,
|
||||||
|
; since use of a segment does not confer additional privileges to user code.
|
||||||
|
;
|
||||||
|
; In newer CPUs, these can also be written with WRFSBASE and WRGSBASE instructions at any privilege level.
|
||||||
|
;
|
||||||
|
; KernelGSBase
|
||||||
|
; MSR with the address 0xC0000102.
|
||||||
|
; Is basically a buffer that gets exchanged with GS.base after a swapgs instruction.
|
||||||
|
; Usually used to seperate kernel and user use of the GS register.
|
||||||
|
;
|
||||||
|
; Debug Registers
|
||||||
|
;
|
||||||
|
; DR0 - DR3
|
||||||
|
; Contain linear addresses of up to 4 breakpoints. If paging is enabled, they are translated to physical addresses.
|
||||||
|
; DR6
|
||||||
|
; It permits the debugger to determine which debug conditions have occured.
|
||||||
|
; When an enabled debug exception is enabled, low order bits 0-3 are set before entering debug exception handler.
|
||||||
|
; DR7
|
||||||
|
; Bit Description
|
||||||
|
; 0 Local DR0 Breakpoint
|
||||||
|
; 1 Global DR0 Breakpoint
|
||||||
|
; 2 Local DR1 Breakpoint
|
||||||
|
; 3 Global DR1 Breakpoint
|
||||||
|
; 4 Local DR2 Breakpoint
|
||||||
|
; 5 Global DR2 Breakpoint
|
||||||
|
; 6 Local DR3 Breakpoint
|
||||||
|
; 7 Global DR3 Breakpoint
|
||||||
|
; 16-17 Conditions for DR0
|
||||||
|
; 18-19 Size of DR0 Breakpoint
|
||||||
|
; 20-21 Conditions for DR1
|
||||||
|
; 22-23 Size of DR1 Breakpoint
|
||||||
|
; 24-25 Conditions for DR2
|
||||||
|
; 26-27 Size of DR2 Breakpoint
|
||||||
|
; 28-29 Conditions for DR3
|
||||||
|
; 30-31 Size of DR3 Breakpoint
|
||||||
|
;
|
||||||
|
; A local breakpoint bit deactivates on hardware task switches, while a global does not.
|
||||||
|
; 00b condition means execution break, 01b means a write watchpoint, and 11b means an R/W watchpoint.
|
||||||
|
; 10b is reserved for I/O R/W (unsupported).
|
||||||
|
;
|
||||||
|
; Test Registers
|
||||||
|
; Name Description
|
||||||
|
; TR3 - TR5 Undocumented
|
||||||
|
; TR6 Test Command Register
|
||||||
|
; TR7 Test Data Register
|
||||||
|
;
|
||||||
|
; Protected Mode Registers
|
||||||
|
; GDTR
|
||||||
|
;
|
||||||
|
; Operand Size Label Description
|
||||||
|
; 64-bit 32-bit
|
||||||
|
; Bits 0-15 (Same) Limit Size of GDT
|
||||||
|
; Bits 16-79 Bits 16-47 Base Starting Address of GDT
|
||||||
|
;
|
||||||
|
; LDTR
|
||||||
|
; Stores the segment selector of the LDT.
|
||||||
|
;
|
||||||
|
; TR
|
||||||
|
; Stores the segment selector of the TSS.
|
||||||
|
;
|
||||||
|
; IDTR
|
||||||
|
; Operand Size Label Description
|
||||||
|
; 64-bit 32-bit
|
||||||
|
; Bits 0-15 (Same) Limit Size of IDT
|
||||||
|
; Bits 16-79 Bits 16-47 Base Starting Address of IDT
|
||||||
|
;=============================================================================================================
|
||||||
|
; END OF REGISTER DOCUMENTATION
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
%ifndef AAL_x86_Def
|
||||||
|
;=============================================================================================================
|
||||||
|
; Instructions Library
|
||||||
|
;=============================================================================================================
|
||||||
|
; NO-Operation : Exchanges value of rax with rax to achieve nothing.
|
||||||
|
%define nop XCHG rax, rax
|
||||||
|
;=============================================================================================================
|
||||||
|
; END - Instructions Library
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Interrupts
|
||||||
|
;=============================================================================================================
|
||||||
|
; BIOS
|
||||||
|
|
||||||
|
; CX, DX Interval in microseconds
|
||||||
|
; CX : High, DX : Low
|
||||||
|
; SystemService
|
||||||
|
%define BIOS_Wait 0x86
|
||||||
|
|
||||||
|
; Memory
|
||||||
|
|
||||||
|
; Real Mode - Conventional Lower Memory
|
||||||
|
%define Mem_RM_CLower_Start 0x0500
|
||||||
|
%define Mem_RM_CLower_End 0x7BFF
|
||||||
|
; 2 Byte Boundary Alignment
|
||||||
|
%define Mem_RM_CLower_2BB_End 0x7BE0
|
||||||
|
|
||||||
|
; Real Mode - Conventional Upper memory
|
||||||
|
%define Mem_RM_CUpper_Start 0x7E00
|
||||||
|
%define Mem_RM_CUpper_End 0x7FFF
|
||||||
|
; 2 Byte Boundary Alignment
|
||||||
|
%define Mem_RM_CUpper_2BB_End 0x7FE0
|
||||||
|
|
||||||
|
; Real Mode - OS Boot Sector
|
||||||
|
%define Mem_BootSector_Start 0x7C00
|
||||||
|
%define Mem_BootSector_512 0x7CFE
|
||||||
|
%define Mem_BootSector_End 0x7DFF
|
||||||
|
|
||||||
|
; Misc System Services
|
||||||
|
%define SystemService 0x15
|
||||||
|
|
||||||
|
; Video
|
||||||
|
%define VideoService 0x10
|
||||||
|
|
||||||
|
; Returns
|
||||||
|
; AH = Number of character columns
|
||||||
|
; AL = Display mode
|
||||||
|
; BH = Active Page
|
||||||
|
%define Video_GetCurrentMode 0x0F
|
||||||
|
|
||||||
|
; Used to set the video mode.
|
||||||
|
%define Video_SetMode 0x00
|
||||||
|
|
||||||
|
; SetVideoMode - Modes
|
||||||
|
; cbOff : Color Burst Off
|
||||||
|
%define VideoMode_Text_40x25_cbOff 0x00
|
||||||
|
%define VideoMode_Text_40x25 0x01
|
||||||
|
%define VideoMode_Text_80x25_cbOff 0x02
|
||||||
|
%define VideoMode_Text_80x25 0x03
|
||||||
|
%define VideoMode_Graphics_320x200 0x04
|
||||||
|
%define VideoMode_Graphics_320x200_cboff 0x05
|
||||||
|
%define VideoMode_Graphics_640x200 0x06
|
||||||
|
|
||||||
|
; Output a character
|
||||||
|
%define Video_TeleType 0xE
|
||||||
|
; Where memory buffer for Video's Text mode starts
|
||||||
|
%define Video_Text_MemBuffer 0xB800
|
||||||
|
;=============================================================================================================
|
||||||
|
; END - Interrupts
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
|
||||||
|
%define char_CR 0xD ; Carriage Return
|
||||||
|
%define char_LF 0xA ; Line Feed
|
||||||
|
|
||||||
|
|
||||||
|
%define AAL_x86_Def
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
BIN
16bit copy.Scratch
Normal file
BIN
16bit copy.Scratch
Normal file
Binary file not shown.
53
16bit.CheckDisplayMode.s
Normal file
53
16bit.CheckDisplayMode.s
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
; TODO: Finish?
|
||||||
|
; Hello world.
|
||||||
|
|
||||||
|
; x86
|
||||||
|
; 16-bit - Real Mode, V86 Mode
|
||||||
|
|
||||||
|
|
||||||
|
%include "AAL.x86.S"
|
||||||
|
|
||||||
|
|
||||||
|
; 16-Bit Mode
|
||||||
|
[BITS 16]
|
||||||
|
|
||||||
|
|
||||||
|
; The ORG directive specifies the starting address of a segment
|
||||||
|
[ORG BIOS_LoadCode_Address]
|
||||||
|
|
||||||
|
|
||||||
|
start :
|
||||||
|
|
||||||
|
textmode_ClearScreen :
|
||||||
|
; Params
|
||||||
|
mov AH, Video_SetMode
|
||||||
|
mov AL, VideoMode_Text_40x25
|
||||||
|
; Call Interrupt
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
textmode_CheckDisplayMode :
|
||||||
|
mov AH, Video_GetCurrentMode
|
||||||
|
int VideoService
|
||||||
|
; Return Values
|
||||||
|
mov BH, AH
|
||||||
|
mov BL, AL
|
||||||
|
|
||||||
|
; Print Cols
|
||||||
|
mov AH, Video_TeleType
|
||||||
|
mov AL, BH
|
||||||
|
int VideoService
|
||||||
|
; Print Mode
|
||||||
|
mov AH, Video_TeleType
|
||||||
|
mov AL, BL
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
|
||||||
|
hang :
|
||||||
|
jmp short ang
|
||||||
|
|
||||||
|
|
||||||
|
; Byte pad 512 bytes (zeroed)
|
||||||
|
times 510-$+start db 0
|
||||||
|
; Master Boot Record signature
|
||||||
|
db 0x55
|
||||||
|
db 0xAA
|
BIN
16bit.Scratch
Normal file
BIN
16bit.Scratch
Normal file
Binary file not shown.
163
16bit.Scratch.s
Normal file
163
16bit.Scratch.s
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
; Print HEx
|
||||||
|
|
||||||
|
; x86
|
||||||
|
; 16-bit - Real Mode, V86 Mode
|
||||||
|
|
||||||
|
; https://codereview.stackexchange.com/questions/230755/display-hexadecimal-value-stored-at-a-register
|
||||||
|
|
||||||
|
|
||||||
|
%include "AAL.x86.S"
|
||||||
|
%include "AAL.x86.routines.macros.S"
|
||||||
|
|
||||||
|
|
||||||
|
; 16-Bit Mode
|
||||||
|
[BITS 16]
|
||||||
|
; The ORG directive specifies the starting address of a segment
|
||||||
|
[ORG Mem_BootSector_Start]
|
||||||
|
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Boot Sector Code
|
||||||
|
;=============================================================================================================
|
||||||
|
start:
|
||||||
|
Video_SetTextMode_80x25
|
||||||
|
|
||||||
|
; Exclusive-OR (xor'ing a value to itself zeros the value)
|
||||||
|
xor AX, AX
|
||||||
|
; Set Data Segment and Extra Segment to 0x0000
|
||||||
|
mov DS, AX
|
||||||
|
mov ES, AX
|
||||||
|
; Set Stack Segment (SS) to to 0x0000
|
||||||
|
mov SS, AX
|
||||||
|
; Set Stack Pointer (SP) to the start of the boot sector.
|
||||||
|
mov BX, Mem_BootSector_Start
|
||||||
|
mov SP, BX
|
||||||
|
|
||||||
|
; String testing
|
||||||
|
String_Out TestStr, [TestStr_len]
|
||||||
|
|
||||||
|
mov AH, BIOS_Wait
|
||||||
|
mov CX, 0x02
|
||||||
|
int SystemService
|
||||||
|
|
||||||
|
; Hex Testing
|
||||||
|
String_Out HexTest, [HexTest_len]
|
||||||
|
Hex16_ToString [HexNum], HexString
|
||||||
|
Hex16_ToString [HexNumT], HexStringT
|
||||||
|
String_Out ResultStr, [ResultStr_len]
|
||||||
|
String_Out HexString, 4
|
||||||
|
String_Out HexStringT, 4
|
||||||
|
|
||||||
|
mov AH, BIOS_Wait
|
||||||
|
mov CX, 0x10
|
||||||
|
int SystemService
|
||||||
|
|
||||||
|
Char_Out char_LF
|
||||||
|
Char_Out char_CR
|
||||||
|
|
||||||
|
mov BX, 0x7C00
|
||||||
|
; sub BX, 0x7DFF
|
||||||
|
; mov BX, 0x0000
|
||||||
|
mov DX, 512
|
||||||
|
call dump_out
|
||||||
|
|
||||||
|
; Idle
|
||||||
|
hang :
|
||||||
|
jmp short hang
|
||||||
|
|
||||||
|
|
||||||
|
dump_out:
|
||||||
|
; Args:
|
||||||
|
; BX = StartLocation
|
||||||
|
; CX = ByteCount
|
||||||
|
%define StartLocation BX
|
||||||
|
%define ByteCount DX
|
||||||
|
push BX
|
||||||
|
push SI
|
||||||
|
; xor BX, BX
|
||||||
|
xor SI, SI
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
cmp SI, ByteCount
|
||||||
|
je .break
|
||||||
|
|
||||||
|
|
||||||
|
push BX
|
||||||
|
push DX
|
||||||
|
push SI
|
||||||
|
mov AX, StartLocation
|
||||||
|
add AX, SI
|
||||||
|
|
||||||
|
Hex16_ToString AX, .HexStr
|
||||||
|
String_Out .HexStr, 4
|
||||||
|
|
||||||
|
pop SI
|
||||||
|
pop DX
|
||||||
|
pop BX
|
||||||
|
|
||||||
|
mov AH, [StartLocation + SI]
|
||||||
|
add SI, 1
|
||||||
|
|
||||||
|
mov AL, [StartLocation + SI]
|
||||||
|
mov [.HexNum], AX
|
||||||
|
|
||||||
|
push BX
|
||||||
|
push DX
|
||||||
|
push SI
|
||||||
|
Char_Out ' '
|
||||||
|
|
||||||
|
Hex16_ToString [.HexNum], .HexStr
|
||||||
|
String_Out .HexStr, 4
|
||||||
|
pop SI
|
||||||
|
pop DX
|
||||||
|
pop BX
|
||||||
|
|
||||||
|
Char_Out ' '
|
||||||
|
|
||||||
|
mov AH, BIOS_Wait
|
||||||
|
mov CX, 0x02
|
||||||
|
int SystemService
|
||||||
|
|
||||||
|
; add SI, 4
|
||||||
|
inc SI
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.break:
|
||||||
|
pop SI
|
||||||
|
pop BX
|
||||||
|
ret
|
||||||
|
|
||||||
|
.HexNum : dw 0x0000
|
||||||
|
.HexStr : dw ' '
|
||||||
|
%undef StartLocation
|
||||||
|
%undef WordCount
|
||||||
|
|
||||||
|
|
||||||
|
%include "AAL.x86.routines.s"
|
||||||
|
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Data
|
||||||
|
;=============================================================================================================
|
||||||
|
TestStr : db 'String Test', char_LF, char_CR
|
||||||
|
TestStr_len : dw 13
|
||||||
|
|
||||||
|
HexTest : db 'Hex Test', char_LF, char_CR
|
||||||
|
HexTest_len : dw 10
|
||||||
|
|
||||||
|
HexNum : dw 0x1994
|
||||||
|
HexNumT : dw 0x2022
|
||||||
|
HexString : db '0000'
|
||||||
|
HexStringT : db '0000'
|
||||||
|
|
||||||
|
ResultStr : db 'Result: '
|
||||||
|
ResultStr_len : db 8
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Wrap up
|
||||||
|
;=============================================================================================================
|
||||||
|
; Byte pad 512 bytes (zeroed)
|
||||||
|
times 510-$+start db 0
|
||||||
|
; Master Boot Record signature
|
||||||
|
db 0x55
|
||||||
|
db 0xAA
|
43
AAL.x86.routines.macros.s
Normal file
43
AAL.x86.routines.macros.s
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
%ifndef AAL_macro_routines_Def
|
||||||
|
%include "AAL.x86.S"
|
||||||
|
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Interrupts
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
%macro Video_SetTextMode_80x25 0
|
||||||
|
mov AH, Video_SetMode
|
||||||
|
mov AL, VideoMode_Text_80x25
|
||||||
|
int VideoService
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Routines
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
%macro Hex16_ToString 2
|
||||||
|
mov DX, %1
|
||||||
|
mov CX, %2
|
||||||
|
push CX
|
||||||
|
call h16_toString
|
||||||
|
pop CX
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro Char_Out 1
|
||||||
|
mov AX, %1
|
||||||
|
push AX
|
||||||
|
call out_char
|
||||||
|
pop AX
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro String_Out 2
|
||||||
|
mov BX, %1
|
||||||
|
mov AX, %2
|
||||||
|
push AX
|
||||||
|
call out_string
|
||||||
|
pop AX
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%define AAL_macro_routines_Def
|
||||||
|
%endif
|
117
AAL.x86.routines.s
Normal file
117
AAL.x86.routines.s
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
%ifndef AAL_routines_Def
|
||||||
|
|
||||||
|
%include "AAL.x86.S"
|
||||||
|
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Routines
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
; Prints out a 16-bit hex value.
|
||||||
|
h16_toString:
|
||||||
|
; Arg - DX : Hex Num
|
||||||
|
; ArgStr: String
|
||||||
|
%define argStr BP + 6
|
||||||
|
push BX
|
||||||
|
push BP
|
||||||
|
mov BP, SP
|
||||||
|
|
||||||
|
; Half-Byte index
|
||||||
|
push SI
|
||||||
|
xor SI, SI
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
; If all 4-bit slots translate, break
|
||||||
|
cmp SI, 4
|
||||||
|
je .break
|
||||||
|
|
||||||
|
; Get latest half-byte from DX
|
||||||
|
mov AX, DX
|
||||||
|
; Doing only the first right-most digit
|
||||||
|
and AX, 0x000F
|
||||||
|
; Get ASCII numeral or alpha character
|
||||||
|
add AL, 0x30
|
||||||
|
; 0->9 (<= 0x39), A->F (>= 0x39)
|
||||||
|
cmp AL, 0x39 ; Numeral offset
|
||||||
|
jle .SetCharVal
|
||||||
|
add AL, 0x7 ; A-F offset
|
||||||
|
|
||||||
|
.SetCharVal:
|
||||||
|
; Add the char value to the string
|
||||||
|
mov BX, [argStr]
|
||||||
|
; Move to last half-byte
|
||||||
|
add BX, 3
|
||||||
|
; Go to the current half-byte via index offset
|
||||||
|
sub BX, SI
|
||||||
|
; Write ascii hex value to half-byte in ArgStr
|
||||||
|
mov [BX], AL
|
||||||
|
; Rotate the next half-byte over
|
||||||
|
ror DX, 4
|
||||||
|
|
||||||
|
inc SI
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.break:
|
||||||
|
pop SI
|
||||||
|
pop BP
|
||||||
|
pop BX
|
||||||
|
%undef argStr
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; Print out an ASCII character.
|
||||||
|
out_char:
|
||||||
|
%define arg1 BP + 6
|
||||||
|
push BX
|
||||||
|
push BP
|
||||||
|
mov BP, SP
|
||||||
|
|
||||||
|
mov AH, Video_TeleType
|
||||||
|
mov AL, [arg1]
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
pop BP
|
||||||
|
pop BX
|
||||||
|
%undef arg1
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; Print out an ascii string of speicifed length
|
||||||
|
out_string:
|
||||||
|
; Arg - BX: String
|
||||||
|
%define argLen BP + 4 ; String Length
|
||||||
|
; Store previous state of BP and set it to SP
|
||||||
|
; pusha ; 14 bytes
|
||||||
|
push BP ; 4 bytes
|
||||||
|
mov BP, SP
|
||||||
|
; Using the source index
|
||||||
|
push SI ; 0 bytes...
|
||||||
|
xor SI, SI
|
||||||
|
|
||||||
|
; Backup BX for later
|
||||||
|
mov CX, BX
|
||||||
|
mov AH, Video_TeleType
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
; Bounds check
|
||||||
|
cmp SI, [argLen]
|
||||||
|
je .break
|
||||||
|
|
||||||
|
; Output a character
|
||||||
|
mov BX, CX
|
||||||
|
mov AL, [BX + SI]
|
||||||
|
xor BH, BH ; Clear BH for correct active page
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
add SI, 0x1
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.break:
|
||||||
|
pop SI
|
||||||
|
pop BP
|
||||||
|
%undef argLen
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
%define AAL_routines_Def
|
||||||
|
%endif
|
362
AAL.x86.s
Normal file
362
AAL.x86.s
Normal file
@ -0,0 +1,362 @@
|
|||||||
|
;=============================================================================================================
|
||||||
|
;=============================================================================================================
|
||||||
|
;=============================================================================================================
|
||||||
|
; AAL - Assembly Abstraction layer
|
||||||
|
; x86-64
|
||||||
|
; Provides a suite of docs, functionatliy, macros, etc.
|
||||||
|
;
|
||||||
|
; Made while learning x86
|
||||||
|
; Edward R. Gonzalez
|
||||||
|
;=============================================================================================================
|
||||||
|
;=============================================================================================================
|
||||||
|
;=============================================================================================================
|
||||||
|
;
|
||||||
|
; See
|
||||||
|
; https://en.wikibooks.org/wiki/X86_Assembly/16,_32,_and_64_Bits
|
||||||
|
; https://wiki.osdev.org/X86-64
|
||||||
|
; http://www.ctyme.com/rbrown.htm
|
||||||
|
; https://github.com/Captainarash/The_Holy_Book_of_X86/blob/master/book_vol_1.txt
|
||||||
|
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Calling Convention
|
||||||
|
;=============================================================================================================
|
||||||
|
; Calling convention - Caller/Callee Saved Registers
|
||||||
|
;
|
||||||
|
; Caller rules: When calling a function the registers
|
||||||
|
; RAX, RCX, RDX, R8, R9, R10, R11 are considered volatile and must be saved into the stack
|
||||||
|
; by the caller, if it relies on them
|
||||||
|
; (unless otherwise safety-provable by analysis such as whole program optimization).
|
||||||
|
;
|
||||||
|
; Callee rules:
|
||||||
|
; RBX, RBP, RDI, RSI, RSP, R12, R13, R14, and R15
|
||||||
|
; are considered nonvolatile and must be saved and restored from the stack by the callee if it modify them.
|
||||||
|
;=============================================================================================================
|
||||||
|
; END OF CALLING CONVENTION
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Register Documentation
|
||||||
|
;=============================================================================================================
|
||||||
|
; General Purpose
|
||||||
|
; 8 High Low 16 32 64 Intended Purpose
|
||||||
|
; AH AL AX EAX RAX Accumulator
|
||||||
|
; BH BL BX EBX RBX Base
|
||||||
|
; CH CL CX ECX RCX Counter
|
||||||
|
; DH DL DX EDX RDX Data (Used to extend the A register)
|
||||||
|
; SIL SI ESI RSI Source index for strings ops
|
||||||
|
; DIL DI EDI RDI Destination index for string operations
|
||||||
|
; SPL SPL ESP RSP Stack pointer
|
||||||
|
; BPL BP EBP RBP Base pointer (meant for stack frames)
|
||||||
|
; R8B R8W R8D R8 General Purpose (and below)
|
||||||
|
; R9B R9W R9D R9
|
||||||
|
; R10B R10W R10D R10
|
||||||
|
; R11B R11W R11D R11
|
||||||
|
; R12B R12W R12D R12
|
||||||
|
; R13B R13W R13D R13
|
||||||
|
; R14B R14W R14D R14
|
||||||
|
; R15B R15W R15D R15
|
||||||
|
; Instruction Pointer
|
||||||
|
; 16 32 64
|
||||||
|
; IP EIP RIP
|
||||||
|
; Segment
|
||||||
|
; 16
|
||||||
|
; CS Code Segment
|
||||||
|
; DS Data Segment
|
||||||
|
; SS Stack Segment
|
||||||
|
; ES Extra Segment
|
||||||
|
; FS General-purpose
|
||||||
|
; GS General-purpose
|
||||||
|
; RFLAGS
|
||||||
|
; Bit(s) Label Description
|
||||||
|
; 0 CF Carry Flag
|
||||||
|
; 1 1 Reserved
|
||||||
|
; 2 PF Parity Flag
|
||||||
|
; 3 0 Reserved
|
||||||
|
; 4 AF Auxiliary Carry Flag
|
||||||
|
; 5 0 Reserved
|
||||||
|
; 6 ZF Zero Flag
|
||||||
|
; 7 SF Sign Flag
|
||||||
|
; 8 TF Trap Flag
|
||||||
|
; 9 IF Interrupt Enable Flag
|
||||||
|
; 10 DF Direction Flag
|
||||||
|
; 11 OF Overflow Flag
|
||||||
|
; 12-13 IOPL I/O Privilege Level
|
||||||
|
; 14 NT Nested Task
|
||||||
|
; 15 0 Reserved
|
||||||
|
; 16 RF Resume Flag
|
||||||
|
; 17 VM Virtual-8086 Mode
|
||||||
|
; 18 AC Alignment Check / Access Control
|
||||||
|
; 19 VIF Virtual Interrupt Flag
|
||||||
|
; 20 VIP Virtual Interrupt Pending
|
||||||
|
; 21 ID ID Flag
|
||||||
|
; 22-63 0 Reserved
|
||||||
|
|
||||||
|
; Control
|
||||||
|
; CR0
|
||||||
|
; Bit(s) Label Description
|
||||||
|
; 0 PE Protected Mode Enable
|
||||||
|
; 1 MP Monitor Co-Processor
|
||||||
|
; 2 EM Emulation
|
||||||
|
; 3 TS Task Switched
|
||||||
|
; 4 ET Extension Type
|
||||||
|
; 5 NE Numeric Error
|
||||||
|
; 6-15 0 Reserved
|
||||||
|
; 16 WP Write Protect
|
||||||
|
; 17 0 Reserved
|
||||||
|
; 18 AM Alignment Mask
|
||||||
|
; 19-28 0 Reserved
|
||||||
|
; 29 NW Not-Write Through
|
||||||
|
; 30 CD Cache Disable
|
||||||
|
; 31 PG Paging
|
||||||
|
; 32-63 0 Reserved
|
||||||
|
; CR2
|
||||||
|
; Contains the linear (virtual) address which triggered a page fault, available in the page fault's interrupt handler.
|
||||||
|
;
|
||||||
|
; CR3
|
||||||
|
; Bit(s) Label Description Condition
|
||||||
|
; 0-11 0-2 0 Reserved CR4.PCIDE = 0
|
||||||
|
; 3 PWT Page-Level Write Through
|
||||||
|
; 5 PCD Page-Level Cache Disable
|
||||||
|
; 5-11 0 Reserved
|
||||||
|
; 0-11 PCID CR4.PCIDE = 1
|
||||||
|
; 12-63 Physical Base Address of the PML4
|
||||||
|
;
|
||||||
|
; Note that this must be page aligned
|
||||||
|
;
|
||||||
|
; CR4
|
||||||
|
; Bit(s) Label Description
|
||||||
|
; 0 VME Virtual-8086 Mode Extensions
|
||||||
|
; 1 PVI Protected Mode Virtual Interrupts
|
||||||
|
; 2 TSD Time Stamp enabled only in ring 0
|
||||||
|
; 3 DE Debugging Extensions
|
||||||
|
; 4 PSE Page Size Extension
|
||||||
|
; 5 PAE Physical Address Extension
|
||||||
|
; 6 MCE Machine Check Exception
|
||||||
|
; 7 PGE Page Global Enable
|
||||||
|
; 8 PCE Performance Monitoring Counter Enable
|
||||||
|
; 9 OSFXSR OS support for fxsave and fxrstor instructions
|
||||||
|
; 10 OSXMMEXCPT OS Support for unmasked simd floating point exceptions
|
||||||
|
; 11 UMIP User-Mode Instruction Prevention (SGDT, SIDT, SLDT, SMSW, and STR are disabled in user mode)
|
||||||
|
; 12 0 Reserved
|
||||||
|
; 13 VMXE Virtual Machine Extensions Enable
|
||||||
|
; 14 SMXE Safer Mode Extensions Enable
|
||||||
|
; 15 0 Reserved
|
||||||
|
; 17 PCIDE PCID Enable
|
||||||
|
; 18 OSXSAVE XSAVE And Processor Extended States Enable
|
||||||
|
; 19 0 Reserved
|
||||||
|
; 20 SMEP Supervisor Mode Executions Protection Enable
|
||||||
|
; 21 SMAP Supervisor Mode Access Protection Enable
|
||||||
|
; 22 PKE Enable protection keys for user-mode pages
|
||||||
|
; 23 CET Enable Control-flow Enforcement Technology
|
||||||
|
; 24 PKS Enable protection keys for supervisor-mode pages
|
||||||
|
; 25-63 0 Reserved
|
||||||
|
; CR8
|
||||||
|
; CR8 is a new register accessible in 64-bit mode using the REX prefix.
|
||||||
|
; CR8 is used to prioritize external interrupts and is referred to as the task-priority register (TPR).
|
||||||
|
;
|
||||||
|
; The AMD64 architecture allows software to define up to 15 external interrupt-priority classes.
|
||||||
|
; Priority classes are numbered from 1 to 15, with priority-class 1 being the lowest and priority-class 15 the highest.
|
||||||
|
; CR8 uses the four low-order bits for specifying a task priority and the remaining 60 bits are reserved and must be written with zeros.
|
||||||
|
;
|
||||||
|
; System software can use the TPR register to temporarily block low-priority interrupts from interrupting a high-priority task.
|
||||||
|
; This is accomplished by loading TPR with a value corresponding to the highest-priority interrupt that is to be blocked.
|
||||||
|
; For example, loading TPR with a value of 9 (1001b) blocks all interrupts with a priority class of 9 or less,
|
||||||
|
; while allowing all interrupts with a priority class of 10 or more to be recognized.
|
||||||
|
; Loading TPR with 0 enables all external interrupts. Loading TPR with 15 (1111b) disables all external interrupts.
|
||||||
|
;
|
||||||
|
; The TPR is cleared to 0 on reset.
|
||||||
|
; Bit Purpose
|
||||||
|
; 0-3 Priority
|
||||||
|
; 4-63 Reserved
|
||||||
|
; CR1, CR5-7, CR9-15
|
||||||
|
; Reserved, the cpu will throw a #ud exeption when trying to access them.
|
||||||
|
;
|
||||||
|
; CR1, CR5-7, CR9-15
|
||||||
|
; Reserved, the cpu will throw a #ud exeption when trying to access them.
|
||||||
|
;
|
||||||
|
; MSRs
|
||||||
|
;
|
||||||
|
; IA32_EFER
|
||||||
|
; Extended Feature Enable Register (EFER) is a model-specific register added in the AMD K6 processor,
|
||||||
|
; to allow enabling the SYSCALL/SYSRET instruction, and later for entering and exiting long mode.
|
||||||
|
; This register becomes architectural in AMD64 and has been adopted by Intel. Its MSR number is 0xC0000080.
|
||||||
|
;
|
||||||
|
; Bit(s) Label Description
|
||||||
|
; 0 SCE System Call Extensions
|
||||||
|
; 1-7 0 Reserved
|
||||||
|
; 8 LME Long Mode Enable
|
||||||
|
; 10 LMA Long Mode Active
|
||||||
|
; 11 NXE No-Execute Enable
|
||||||
|
; 12 SVME Secure Virtual Machine Enable
|
||||||
|
; 13 LMSLE Long Mode Segment Limit Enable
|
||||||
|
; 14 FFXSR Fast FXSAVE/FXRSTOR
|
||||||
|
; 15 TCE Translation Cache Extension
|
||||||
|
; 16-63 0 Reserved
|
||||||
|
;
|
||||||
|
; FS.base, GS.base
|
||||||
|
;
|
||||||
|
; MSRs with the addresses 0xC0000100 (for FS) and 0xC0000101 (for GS) contain the base addresses of the FS and GS segment registers.
|
||||||
|
; These are commonly used for thread-pointers in user code and CPU-local pointers in kernel code. Safe to contain anything,
|
||||||
|
; since use of a segment does not confer additional privileges to user code.
|
||||||
|
;
|
||||||
|
; In newer CPUs, these can also be written with WRFSBASE and WRGSBASE instructions at any privilege level.
|
||||||
|
;
|
||||||
|
; KernelGSBase
|
||||||
|
; MSR with the address 0xC0000102.
|
||||||
|
; Is basically a buffer that gets exchanged with GS.base after a swapgs instruction.
|
||||||
|
; Usually used to seperate kernel and user use of the GS register.
|
||||||
|
;
|
||||||
|
; Debug Registers
|
||||||
|
;
|
||||||
|
; DR0 - DR3
|
||||||
|
; Contain linear addresses of up to 4 breakpoints. If paging is enabled, they are translated to physical addresses.
|
||||||
|
; DR6
|
||||||
|
; It permits the debugger to determine which debug conditions have occured.
|
||||||
|
; When an enabled debug exception is enabled, low order bits 0-3 are set before entering debug exception handler.
|
||||||
|
; DR7
|
||||||
|
; Bit Description
|
||||||
|
; 0 Local DR0 Breakpoint
|
||||||
|
; 1 Global DR0 Breakpoint
|
||||||
|
; 2 Local DR1 Breakpoint
|
||||||
|
; 3 Global DR1 Breakpoint
|
||||||
|
; 4 Local DR2 Breakpoint
|
||||||
|
; 5 Global DR2 Breakpoint
|
||||||
|
; 6 Local DR3 Breakpoint
|
||||||
|
; 7 Global DR3 Breakpoint
|
||||||
|
; 16-17 Conditions for DR0
|
||||||
|
; 18-19 Size of DR0 Breakpoint
|
||||||
|
; 20-21 Conditions for DR1
|
||||||
|
; 22-23 Size of DR1 Breakpoint
|
||||||
|
; 24-25 Conditions for DR2
|
||||||
|
; 26-27 Size of DR2 Breakpoint
|
||||||
|
; 28-29 Conditions for DR3
|
||||||
|
; 30-31 Size of DR3 Breakpoint
|
||||||
|
;
|
||||||
|
; A local breakpoint bit deactivates on hardware task switches, while a global does not.
|
||||||
|
; 00b condition means execution break, 01b means a write watchpoint, and 11b means an R/W watchpoint.
|
||||||
|
; 10b is reserved for I/O R/W (unsupported).
|
||||||
|
;
|
||||||
|
; Test Registers
|
||||||
|
; Name Description
|
||||||
|
; TR3 - TR5 Undocumented
|
||||||
|
; TR6 Test Command Register
|
||||||
|
; TR7 Test Data Register
|
||||||
|
;
|
||||||
|
; Protected Mode Registers
|
||||||
|
; GDTR
|
||||||
|
;
|
||||||
|
; Operand Size Label Description
|
||||||
|
; 64-bit 32-bit
|
||||||
|
; Bits 0-15 (Same) Limit Size of GDT
|
||||||
|
; Bits 16-79 Bits 16-47 Base Starting Address of GDT
|
||||||
|
;
|
||||||
|
; LDTR
|
||||||
|
; Stores the segment selector of the LDT.
|
||||||
|
;
|
||||||
|
; TR
|
||||||
|
; Stores the segment selector of the TSS.
|
||||||
|
;
|
||||||
|
; IDTR
|
||||||
|
; Operand Size Label Description
|
||||||
|
; 64-bit 32-bit
|
||||||
|
; Bits 0-15 (Same) Limit Size of IDT
|
||||||
|
; Bits 16-79 Bits 16-47 Base Starting Address of IDT
|
||||||
|
;=============================================================================================================
|
||||||
|
; END OF REGISTER DOCUMENTATION
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
%ifndef AAL_x86_Def
|
||||||
|
;=============================================================================================================
|
||||||
|
; Instructions Library
|
||||||
|
;=============================================================================================================
|
||||||
|
; NO-Operation : Exchanges value of rax with rax to achieve nothing.
|
||||||
|
%define nop XCHG rax, rax
|
||||||
|
;=============================================================================================================
|
||||||
|
; END - Instructions Library
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Interrupts
|
||||||
|
;=============================================================================================================
|
||||||
|
; BIOS
|
||||||
|
|
||||||
|
; CX, DX Interval in microseconds
|
||||||
|
; CX : High, DX : Low
|
||||||
|
; SystemService
|
||||||
|
%define BIOS_Wait 0x86
|
||||||
|
|
||||||
|
; Disk
|
||||||
|
|
||||||
|
; AL = Number of sectors to read (must be non-zero)
|
||||||
|
; CH = Track/Cylinder Number
|
||||||
|
; CL = Sector Number
|
||||||
|
; DH = Head Number
|
||||||
|
; DL = Drive Number
|
||||||
|
; ES:BX = Pointer to Buffer
|
||||||
|
%define Disk_ReadIntoMemory 0x02
|
||||||
|
|
||||||
|
; Disk Services (Storage)
|
||||||
|
%define DiskService 0x13
|
||||||
|
|
||||||
|
; Memory
|
||||||
|
|
||||||
|
; Real Mode - Conventional Lower Memory
|
||||||
|
%define Mem_RM_CLower_Start 0x0500
|
||||||
|
%define Mem_RM_CLower_End 0x7BFF
|
||||||
|
; 2 Byte Boundary Alignment
|
||||||
|
%define Mem_RM_CLower_2BB_End 0x7BE0
|
||||||
|
|
||||||
|
; Real Mode - Conventional Upper memory
|
||||||
|
%define Mem_RM_CUpper_Start 0x7E00
|
||||||
|
%define Mem_RM_CUpper_End 0x7FFF
|
||||||
|
; 2 Byte Boundary Alignment
|
||||||
|
%define Mem_RM_CUpper_2BB_End 0x7FE0
|
||||||
|
|
||||||
|
; Real Mode - OS Boot Sector
|
||||||
|
%define Mem_BootSector_Start 0x7C00
|
||||||
|
%define Mem_BootSector_512 0x7CFE
|
||||||
|
%define Mem_BootSector_End 0x7DFF
|
||||||
|
|
||||||
|
; Misc System Services
|
||||||
|
%define SystemService 0x15
|
||||||
|
|
||||||
|
; Video
|
||||||
|
%define VideoService 0x10
|
||||||
|
|
||||||
|
; Returns
|
||||||
|
; AH = Number of character columns
|
||||||
|
; AL = Display mode
|
||||||
|
; BH = Active Page
|
||||||
|
%define Video_GetCurrentMode 0x0F
|
||||||
|
|
||||||
|
; Used to set the video mode.
|
||||||
|
%define Video_SetMode 0x00
|
||||||
|
|
||||||
|
; SetVideoMode - Modes
|
||||||
|
; cbOff : Color Burst Off
|
||||||
|
%define VideoMode_Text_40x25_cbOff 0x00
|
||||||
|
%define VideoMode_Text_40x25 0x01
|
||||||
|
%define VideoMode_Text_80x25_cbOff 0x02
|
||||||
|
%define VideoMode_Text_80x25 0x03
|
||||||
|
%define VideoMode_Graphics_320x200 0x04
|
||||||
|
%define VideoMode_Graphics_320x200_cboff 0x05
|
||||||
|
%define VideoMode_Graphics_640x200 0x06
|
||||||
|
|
||||||
|
; Output a character
|
||||||
|
%define Video_TeleType 0xE
|
||||||
|
; Where memory buffer for Video's Text mode starts
|
||||||
|
%define Video_Text_MemBuffer 0xB800
|
||||||
|
;=============================================================================================================
|
||||||
|
; END - Interrupts
|
||||||
|
;=============================================================================================================
|
||||||
|
|
||||||
|
|
||||||
|
%define char_CR 0xD ; Carriage Return
|
||||||
|
%define char_LF 0xA ; Line Feed
|
||||||
|
|
||||||
|
|
||||||
|
%define AAL_x86_Def
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
79
Erus.boot.s
Normal file
79
Erus.boot.s
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
; Print HEx
|
||||||
|
|
||||||
|
; x86
|
||||||
|
; 16-bit - Real Mode, V86 Mode
|
||||||
|
|
||||||
|
; https://codereview.stackexchange.com/questions/230755/display-hexadecimal-value-stored-at-a-register
|
||||||
|
|
||||||
|
|
||||||
|
%include "AAL.x86.s"
|
||||||
|
%include "AAL.x86.routines.macros.s"
|
||||||
|
|
||||||
|
|
||||||
|
; 16-Bit Mode
|
||||||
|
[BITS 16]
|
||||||
|
; The ORG directive specifies the starting address of a segment
|
||||||
|
[ORG Mem_BootSector_Start]
|
||||||
|
|
||||||
|
|
||||||
|
start:
|
||||||
|
mov BX, Mem_BootSector_Start
|
||||||
|
|
||||||
|
mov AH, BIOS_Wait
|
||||||
|
mov CX, 0x10
|
||||||
|
int SystemService
|
||||||
|
|
||||||
|
; Exclusive-OR (xor'ing a value to itself zeros the value)
|
||||||
|
xor AX, AX
|
||||||
|
; Set Data Segment and Extra Segment to 0x0000
|
||||||
|
mov DS, AX
|
||||||
|
mov ES, AX
|
||||||
|
; Set Stack Segment (SS) to to 0x0000
|
||||||
|
mov SS, AX
|
||||||
|
; Set Stack Pointer (SP) to the start of the boot sector.
|
||||||
|
mov SP, BX
|
||||||
|
|
||||||
|
mov BX, Str_Erus
|
||||||
|
mov CX, 4
|
||||||
|
push CX
|
||||||
|
call out_string
|
||||||
|
pop CX
|
||||||
|
|
||||||
|
mov BX, Str_PostMsg
|
||||||
|
mov CX, 22
|
||||||
|
push CX
|
||||||
|
call out_string
|
||||||
|
pop CX
|
||||||
|
|
||||||
|
mov AH, BIOS_Wait
|
||||||
|
mov CX, 0x10
|
||||||
|
int SystemService
|
||||||
|
|
||||||
|
mov AH, Video_SetMode
|
||||||
|
mov AL, VideoMode_Text_80x25
|
||||||
|
int VideoService
|
||||||
|
|
||||||
|
mov BX, Str_Erus
|
||||||
|
mov CX, 4
|
||||||
|
push CX
|
||||||
|
call out_string
|
||||||
|
pop CX
|
||||||
|
|
||||||
|
; Idle
|
||||||
|
hang :
|
||||||
|
jmp short hang
|
||||||
|
|
||||||
|
%include "AAL.x86.routines.s"
|
||||||
|
|
||||||
|
; Data
|
||||||
|
Str_Erus: db 'Erus'
|
||||||
|
Str_PostMsg : db '... taking over boot', 0xA, 0xD
|
||||||
|
|
||||||
|
;=============================================================================================================
|
||||||
|
; Wrap up
|
||||||
|
;=============================================================================================================
|
||||||
|
; Byte pad 512 bytes (zeroed)
|
||||||
|
times 510-$+start db 0
|
||||||
|
; Master Boot Record signature
|
||||||
|
db 0x55
|
||||||
|
db 0xAA
|
8
bare_x86.code-workspace
Normal file
8
bare_x86.code-workspace
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": "."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user