Once again, I deployed a Linux-image to a USB-drive (for some reason it turned out to be Manjaro, but this is a completely different story), and strange thoughts crept into my head: the BIOS saw a USB flash drive, and then what? Well, yes, there is an MBR, most likely GRUB, and ... And once in MBR someone else's custom code was popped up, it means that a simple person from Adygea can program something on a "big" computer, but outside the operating system.
And since itβs too bold to do such things in high-level languages, and we donβt know assemblers, weβll spar directly on the opcodes for 8086.

Introduction
Plan:
- Withdraw
#
- Withdraw
Hello, Habrauser!
- Display input characters (you can already entertain children).
Disclaimers and Disclaimers
In order not to bother with the roar of the flopper, we will train cats QEMU. , , dd
x86- . .
MBR, - (?) (?) β , Enter
. .
β , ( !) - . ( .) ! .
MBR
:
- ,
Bootstrap Area
. - , ( )
0x7c00
( Compaq). - , , ( , --). : 640KB, . ( , .)
, β , .
, , , , (sic!) . , ( - ), , .
, - «» 80- «-» 90-, : «» «». «», Lode Runner, «».
«» +
!
-, , , , , β errata.
, , , .
:
- ,
MOV
, INT
, ADD
, DIV
β , , , . , , , . - , , , :
imm8
, r16
, r/m32
, rel8
. , , (, ) , , DIV BL
F6 F3
(DIV
r/m8
, , , β .) F6
β DIV
, NEG
, ( opcode extension
β .)
, , dd
, , , , , β , , -. -, β¦ , POSIX , !
β $ echo "48 65 6c 6c 6f 2c 20 48 61 62 72 21" | xxd -r -p
Hello, Habr!%
:
β $ echo -e "# Comment\n48 65 6c 6c 6f 2c 20 # First line\n48 61 62 72 21 # Last line" | sed 's/#.*$//g' | xxd -r -p
Hello, Habr!%
( sed
-, xxd
, hex-dump. ?)
, , .
, sh-#!/bin/sh
IN="${1:-/dev/stdin}"
OUT="${2:-/dev/stdout}"
> $OUT
while read line
do
echo "$line" | sed 's/#.*$//' | xxd -r -p >> $OUT
done < $IN
: LF
(aka \n
), . , , , , - , β .
β , !
β $ ./build loader.mbr loader.img && stat -f %z loader.img
512
512 β , . , .
, bin
- 512B, . Β« dd
/dev/zero
, !Β» β . , c ( , ipython
) !
,
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
, , , QEMU, Exception'.

, , ( ), MBR.
,...
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00
, :
55 AA
:
$ qemu-system-i386 -nic none loader.img
-nic none
, PXE, β .

, BIOS , ! , !
PRINT "#"
, !
, . :
B4 0E
B0 23
CD 10
00 00
00 00 00 00 00 00 00 00
( , 512).
, QEMU !

, , , , :
B4 0E
β AH
0E
( mov ah, 0e
), BIOS ( ), , .B0 23
β : AL
#
. ? «»? β ASCII- man ascii
!CD 10
β : BIOS-, . , AL
AH
, , : .
, AL
:
$
(B0 24
)%
(B0 25
)Γ‘
(B0 A0
, )
PRINT "Hello, Habrauser!"
, , . .
- . β printf('Hell of word')
.
, , :
,
B4 0E
B0 0A
CD 10
B0 48
CD 10
B0 65
CD 10
B0 6C
CD 10
B0 6C
CD 10
B0 6F
CD 10
B0 2C
CD 10
B0 20
CD 10
B0 48
CD 10
B0 61
CD 10
B0 62
CD 10
B0 72
CD 10
B0 61
CD 10
B0 75
CD 10
B0 73
CD 10
B0 65
CD 10
B0 72
CD 10
B0 21
CD 10
00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
,
, , :

:
- ,
- , ,
- , BIOS' β - ,
Booting from Hard Disk...
.
, :
B8 00 06
CD 10
B4 0E
BE 80 7C
AC
3C 00
74 06
CD 10
EB F7
00 00 00 00 00
00 00 00 00 00 00 00 00
...
48 65 6C 6C 6F 2C 20 48
61 62 72 61 75 73 65 72
21
00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
:
- : ,
0x7c00
, . ? data- ( ), ( !), SI
β . SI
AC
( LODS
). , SI
AL
, SI
! , !- . , . , , ?
AL
, , β ( , 6 ), 00
.AL
- , BIOS-...- β¦ 7 β
LODS
!
, . , .
, - . : BIOS- . β¦ . β ( , β ).
, . printer.mbr
typewriter.mbr
.
, :
B4 07
B0 00
CD 10
B4 00
CD 16
3C 0D
75 06
B4 0E
CD 10
B0 0A
B4 0E
CD 10
EB EC
1
:
- ( QEMU) .
AH = 00h
16h
, , , AL
.- , :
OD
(aka CR
aka
), Return
/Enter
, , ( -), . CR
CR
, LF
, , Enter
.AL
OD
, , .- : -- , ! 20 .
, :

, :
- , «» ,
- , ,
- «»:
Backspace
, .
. emacs
- .
, .
, - :

, . , :
B8 12 00
CD 10
B4 0E
B3 00
FE C3
BE 80 7C
AC
3C 00
74 F6
CD 10
EB F7
00
00 00 00 00 00 00 00 00
...
48 65 6C 6C 6F 2C 20 48
61 62 72 61 68 61 62 72
21 20
00 00 00 00 00 00
00 00 00 00 00 00 00 00
color-printer.mbr
- (? ? BIOS?) , ,
BL
(. , .)FE
BL
- : , , , .
.
, .
, :
β !
β .
, Sublime Text :
β --, ! !
.
- .
UPD: eisaev, Andrew_Pinkerton, MrSmith33, Anthony1025 , , .