Encore une fois, j'ai déployé une image Linux sur une clé USB (pour une raison quelconque, il s'est avéré que c'était Manjaro, mais c'est une histoire complètement différente), et des pensées étranges se sont glissées dans ma tête: le BIOS a vu une clé USB, et puis quoi? Eh bien, oui, il y a un MBR, très probablement GRUB, et ... Et une fois que le code personnalisé de quelqu'un d'autre a été affiché, cela signifie qu'une simple personne d'Adygea peut programmer quelque chose sur un "gros" ordinateur, mais en dehors du système d'exploitation.
Et comme il est trop audacieux de faire de telles choses dans des langages de haut niveau, et que nous ne connaissons pas les assembleurs, nous allons spar directement sur les opcodes pour 8086.

introduction
Plan:
- Se désister
#
- Se désister
Hello, Habrauser!
- Affichez les caractères saisis (vous pouvez déjà divertir les enfants).
Avertissements et dénis de responsabilité
Afin de ne pas vous embêter avec le rugissement du flopper, nous nous entraînerons sur chats 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 , , .