アセンブラ編 入替えプログラム ~できた~
8086
"コンピュータのしくみを理解するための10章"のASCアセンブラでプログラムを考えようと思いましたが、8086との違いが大きいのではじめから8086アセンブラで考えます。
はじめに思いついたのは、前に考えた回路を、ANDとORとNOTの命令で作ることです。
だけど、これだと"program"は逆さまにできても、"tomato"はできません。
"tomato"にはまた別のプログラムがいります。
細山田さんのやつのように、キーボードで単語を打ち込んで、それを逆さまに表示するようなのにしたいです。
プログラムの流れを、
- キーボードからの単語をメモリに入れる。
- メモリを逆さまに読み出して画面に出す。
にわけて考えます。
まず、キーボードからの単語をメモリに入れる命令を調べました。
押されたキーを読み取る命令はint 16hです。アスキーコードがalに入ります。
ストアの命令はmovです。ASCと違いレジスタが複数あるので指定しないといけません。
次に、メモリを読み出して画面に出す命令を調べました。
ロードの命令はmovです。なぜかストアと同じです。
画面に文字を出す命令はint 10hです。alにアスキーコードを入れておきます。
肝心の"逆さまに"は、単語のメモリアドレスを後ろから読むことでやります。
レジスタdiの間接アドレス指定を使いました。
レジスタdiに単語の最後の文字のアドレスを入れておきます。
読み取るときには、diの指定するアドレスの指定する文字データを画面に表示させて、そのたびにdiを減らし、これを先頭の文字まで繰り返します。
あとは、8086のためのおまじないが必要になります。
コードの開始アドレスが7c00hに決められています。疑似命令orgで指定します。
コードの大きさが512バイトに決められています。埋め草を入れます。
コードの終わりの2バイトはaa55hに決められています。
自由に使えるメモリの位置が決められています。7e00hを使います。
できあがったプログラムです。
org 0x7c00 bits 16 cli xor ax, ax mov ds, ax mov si, 0x7e00 mov di, si yomitori: mov ah, 0x00 int 0x16 mov ah, 0x0e int 0x10 cmp al, 0x0d jz irekae cmp al, 0x08 jz .backspace mov [di], al inc di jmp yomitori .backspace cmp di, si jz yomitori mov ax, 0x0a20 mov cx, 0x01 int 0x10 mov BYTE [di], 0x00 dec di jmp yomitori kaigyo: mov ah, 0x03 int 0x10 mov ah, 0x02 mov dl, 0x00 inc dh int 0x10 ret irekae: cmp di, si jz yomitori call kaigyo mov ah, 0x0e .hyouji: dec di mov al, [di] int 0x10 cmp di, si jnz .hyouji call kaigyo jmp yomitori times 510-($-$$) db 0 dw 0xaa55
"コンピュータのしくみを理解するための10章"にキーボードエコーがあるとよいと書かれていたので、yomitoriに足しました。
見やすくするために、単語や逆さま単語ごとに改行することにしました。
あと、はてな記法は7c00hだと変な色になるので0x7c00にしました。
scheme(の動かないプログラム)よりもずいぶん長くなりました。
でも、yomitoriやkaigyoの分が長いだけで、irekaeのところは同じぐらいです。
さっそく実行します。
もらったメモを見ながらアセンブリ言語を機械語にします。
> yasm irekae.asm
機械語のファイルをフロッピーかCD-Rに書き込みます。
> dd if=/dev/zero of=floppy bs=1024 count=1440 > dd if=irekae of=floppy seek=0 count=1 conv=notrunc
ノートパソコンにはフロッピーはないのでCD-RWにします。
> cp floopy boot/ > mkisofs -input-charset iso8859-1 -o cdr.iso -b floppy -hide floppy boot/ > cdrecord dev=/dev/sr0 blank=fast -data cdr.iso
CDを入れたままパソコンを再起動するとガコガコいって入替えプログラムが始まります。
program⏎と打ち込むとmargorpが表示されます。
tomato⏎もotamotになりました。
できました!!
満足したので電源ボタンを長押しして終了させました。☠