2023/4/12 メモ
**普段から本に勝手にあだ名つけてよんでるので、ここではリバースエンジニアリングバイブルをばいぶる君、自作エミュレータで学ぶx86アーキテクチャをえみゅ本として書いていますごめんなさい**
りば本でアセンブリ言語の命令をみてて、そういえばint~~~となりえみゅほんのbios章とデバイスアクセス(3.12章)の章を読んだ。
bois君にはパソコンの電源を居れた直後の機器の初期化や、hddから最初のプログラムローダをメモリに読みだす役割がある。呼び名だけは生き残った。
それはそうとアセンブリ言語を学ぶときにもbiosの基本的な入出力機能が役に立つ。ここではbiosの文字表示機能がありがたき存在なり...☆彡
biosの機能を用いて画面上に'A'を表示するプログラム。
mov bh, 0 ;
mov bl, 15 ; 文字色は白
mov ah, 0x0e ; 1文字表示
mov al, 0x4 ; 'A'= 0x41
int 0x10 ; bios呼び出し
biosをよびだすには、必要なレジスタに値を設定してからint命令を実行する。
intオペランドとahレジスタの値の組み合わせでbiosが持つ機能群の中のどれを呼び出すか選択する。
このプログラムでは int 0x10 と ah=0x0e であり、1文字表示機能を呼び出すことになる。
表示したい文字コードをalに、文字色をblに指定しておけば、その色で画面に一文字だけ表示される。
intはcpuにソフトウェア割り込みを発生させる命令。callとちょっと似てる(ちがう)つまり int N とかいてN番のサブルーチンをcallする。
Nには0x00から0xffまでに256種類の番号を指定することが出来て、それぞれの番号に応じたサブルーチンが呼び出される。
次は2文字以上の文字を表示するプログラム~~
start:
mov si,msg
call puts
fin:
hlt
jmp fin
puts:
mov al, [si]
cmp al, 0
je puts_end
mov ah, 0x0e
mov bx, 15
int 0x10 ;既定のレジスタに値をぶち込んだら、割り込み命令でbiosの機能を呼び出す。
jmp puts
puts_end:
ret ;サブルーチンから抜ける
msg:
db "hello world", 0x0d, 0x0a, 0
このプログラムの実行が始まるとSIレジスタにmsgのメモリ番地を設定してからputsを呼び出す。
callはメモリ上のとある場所に、call命令の次の命令がおいてあるメモリ番地をメモしてから、目的のサブルーチンにジャンプする。
※メモリ上のとある場所にメモするというのは、実際はスタックの先頭にプッシュすること。
そうしてサブルーチンを実行していくと最後にretに出会う。retは先ほどメモしたメモリ番地を取り出し、
その番地へジャンプする。それはちょうどhlt命令のある場所の番地になっており、無事、サブルーチンを呼び出してもどってこれました~。めでたしめでたし