Una vez más, implementĂ© una imagen de Linux en una unidad USB (por alguna razĂłn resultĂł ser Manjaro, pero esta es una historia completamente diferente), y pensamientos extraños se deslizaron en mi cabeza: el BIOS vio una unidad flash USB, Âży luego quĂ©? Bueno, sĂ, hay un MBR, muy probablemente GRUB, y ... Y una vez en MBR apareciĂł el cĂłdigo personalizado de otra persona, significa que una persona simple de Adygea puede programar algo en una computadora "grande", pero fuera del sistema operativo.
Y dado que es demasiado audaz para hacer tales cosas en idiomas de alto nivel, y no conocemos ensambladores, discutiremos directamente en los cĂłdigos de operaciĂłn para 8086.

IntroducciĂłn
Plan:
- Retirar
#
- Retirar
Hello, Habrauser!
- Mostrar caracteres de entrada (ya puede entretener a los niños).
Renuncias y Renuncias
Para no molestarnos con el rugido del flopper, entrenaremos gatos 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 , , .