RSS ログイン
Date==== Time==== Update==== Time==== Title==== [[W]WRITE [RET]READ [?]HELP]
2025-06-15 18:19:10 2025-06-15 18:25:17 【父の日】父の日なので、プログラマの父に機械語(アセンブリ)で書いたお手紙を送った
TEXT FILE (   3KiB ) を受信しますか? [Y]/[N] > Y

父の日 NASM 機械語 アセンブリ BIOS

今日は父の日です

2025年6月15日は父の日です。
ということで、プログラマの父に機械語で書いたお手紙を送ることにしました。

機械語(アセンブリ)

丁度私はOS開発で得た知識があり、アセンブリ(NASM)への理解も有ったため、
BIOS上で動くプログラムを作ることにしました。

条件
・512バイト(BIOSは先頭の512バイトを読み込むはず)
・良い感じの画面(デザインセンスは放棄した)
・印刷できる
・フロッピーに収まる

完成品

分かる人には分かるコードだと思います。
何処かで見たこともありますよね?
; 父の日2025年06月15用のアセンブリコード
;動作環境:BIOS
;媒体:フロッピー

;・概要
;BIOSが最初に読み込むIPLに記述しています。
;そのため512バイトという制限があります。

%define NL 0x0D, 0x0A		;\r\n

%macro print 1
	%push print_scope
	MOV		SI, %1
%$loop:
	MOV		AL, [SI]
	ADD		SI, 1
	CMP		AL, 0
	JE		%$end
	MOV		AH, 0x0E
	MOV		BX, 15
	INT		0x10
	JMP		%$loop
%$end:
	%pop
%endmacro

CYLS	EQU		10			;どこまで読み込むか
		ORG		0x7C00		;このプログラムがメモリ上のどこに読み込まれるか

;FAT12フォーマットのフロッピーのための記述
	JMP		entry
	DB		0x90
	DB		"20250615"
	DW		512
	DB		1
	DW		1
	DB		2
	DW		224
	DW		2880
	DB		0xF0
	DW		9
	DW		18
	DW		2
	DD		0
	DD		2880
;FAT12/16におけるオフセット36以降のフィールド
	DB		0x00
	DB		0x00
	DB		0x29
	DD		0xFFFFFFFF
	DB		"CHICHINOHI "
	DB		"FAT12   "
	TIMES	18 DB 0

entry:
	MOV		AX, 0			;レジスタ初期化
	MOV		SS, AX
	MOV		SP, 0x7C00
	MOV		DS, AX
	;画面クリア
	MOV		AH, 0x06		;スクロールアップ
	MOV		AL, 0			;AL=スクロール行数(0)で全削除
	MOV		BH, 0x3E		;BH=属性
	MOV		CX, 0x0000		;CH=Row/CL=Col(左上)
	MOV		DX, 0x184F		;DH=Row/DL=79(左下)
	INT		0x10

	MOV		AH, 0x02
	MOV		BH, 0x00
	MOV		DL, 15
	MOV		DH, 9
	INT		0x10
	print	d
	print	d

	MOV		AH, 0x02
	MOV		BH, 0x00
	MOV		DL, 20
	MOV		DH, 10
	INT		0x10
	print	a

	MOV		AH, 0x02
	MOV		BH, 0x00
	MOV		DL, 15
	MOV		DH, 11
	INT		0x10
	print	b

	MOV		AH, 0x02
	MOV		BH, 0x00
	MOV		DL, 28
	MOV		DH, 12
	INT		0x10
	print	c

	MOV		AH, 0x02
	MOV		BH, 0x00
	MOV		DL, 15
	MOV		DH, 13
	INT		0x10
	print	d
	print	d

	MOV		AH, 0x02
	MOV		BH, 0x00
	MOV		DL, 0
	MOV		DH, 0
	INT		0x10

a:
	DB		"OTOUSAN ICUMO ALIGATOU", NL
	DB		0
b:
	DB		"KONGOMO JOLOSHIKU ONEGAI SHIMASU", NL
	DB		0
c:
	DB		"\( 'w')/", NL
	DB		0
d:
	DB		"================"
	DB		0

	TIMES	(0x7DFE - 0x7C00 - ($ - $$)) DB 0	; 現在の場所から0x1Fdまで(残りの未使用領域)を0で埋める。
	DB		0x55, 0xaa

たぶん駄文

多分その道の人からすれば「此処はこうすれば良いのでは?」とかあると思いますが、
まあ、私は趣味でやってるので、これで良いです。
ちなみに確かカツカツだったはずです。