مرة أخرى ، قمت بنشر صورة Linux على محرك أقراص USB (لسبب ما تبين أنه Manjaro ، لكن هذه قصة مختلفة تمامًا) ، وتسللت الأفكار الغريبة إلى رأسي: رأى BIOS محرك أقراص USB محمول ، ثم ماذا؟ حسنًا ، نعم ، هناك MBR ، على الأرجح GRUB ، و ... ومرة واحدة في MBR ظهرت برمجية مخصصة لشخص آخر ، فهذا يعني أن شخصًا بسيطًا من Adygea يمكنه برمجة شيء على كمبيوتر "كبير" ، ولكن خارج نظام التشغيل.
ونظرًا لكونها جريئة جدًا للقيام بمثل هذه الأشياء بلغات عالية المستوى ، ولا نعرف المجمعين ، فإننا سنقرن حقًا في رموز التشغيل لـ 8086.

المقدمة
خطة:
- انسحب
# - انسحب
Hello, Habrauser! - عرض أحرف الإدخال (يمكنك بالفعل ترفيه الأطفال).
إخلاء المسؤولية وإخلاء المسؤولية
لكي لا تهتم بصخب الزناد ، سنتدرب قطط 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 , , .