貝類

盆栽と古代料理とマルウェア関連がすき。蝋梅が毎日かわいい

bios君よ永遠なれ

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命令のある場所の番地になっており、無事、サブルーチンを呼び出してもどってこれました~。めでたしめでたし

 

えみゅ本のサンプルプログラム、カーネルのメモリマネージャー.cppなど注釈つきで読みやすいのでオヌヌメです。