(いや、ちゃんと目標があってだけど)
(Shemeはどうした?勉強してますよ)
どうでもいいけど、アセンブリ言語をアセンブラでアセンブルするんですよ(多分)
AssemblyをAssemblerでAssembleするかね、英単語にするとちと分かりやすい?
(yをeeにすると、employ、interviewと同じ関係やね)
横道どころでなくそれた。
最初(未だに)、NASMを使うか、GASにするか。NASMはIntel標準なので、(ちょっとだけ)汎用性が高い。GASはGCCとの親和性が抜群。
とりあえず、標準という言葉に弱いので、NASMにした。
アセンブリ言語の構造は非常に簡単といってもいいと思う。
基本、こんな感じ
;; 簡単なprint ;; 呼び出しは、 ;; mov si, msg_pointer ;; call print ;; こんな感じ print: pusha xor bx, bx .loop: lodsb or al, al jz .end mov ah, 0x0e int 0x10 jmp short .loop .end: popa ret命令とレジスタの組み合わせでいろいろやる。ここまでは、それなりにいろいろ言語をやってきたので簡単に理解。
問題はこの辺
mov ah, 0x0e
int 0x10
今となっては何か分かっているのだが、最初は何のことやら・・・
これは、上のlodsbでALレジスタにSIレジスタに格納されている文字列の先頭を格納していることを前提に、AHレジスタにBIOSの0x0e(表示)命令を入れて、int 0x10で実行している。
BIOSのint 0x10はビデオ関係の命令を実行するという意味で、
AHレジスタに一文字表示の命令0x0eを格納し、ALレジスタに文字コードを入れる。
BIOSの命令は、使用するレジスタ、命令の種類が決まっているので、それを調べる必要がある。
例えば、こことか。
後は、セグメントとオフセット、各レジスタの意味とかが重要になってくる。
正直、覚えられん(まだ1週間・・・)
とりあえずの、備忘録。
No comments:
Post a Comment