【父の日】父の日なので、プログラマの父に機械語(アセンブリ)で書いたお手紙を送った
作成日:2025-06-15 18:19:10
最新更新日:2025-06-15 18:25:17
今日は父の日です
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
たぶん駄文
多分その道の人からすれば「此処はこうすれば良いのでは?」とかあると思いますが、
まあ、私は趣味でやってるので、これで良いです。
ちなみに確かカツカツだったはずです。
ログインするとコメントを書くことができます
もっとコメントを見る