白いパソコン

プログラミングをもらったパソコンでがんばります。

アセンブラ編 入替えプログラム ~できた~

8086

"コンピュータのしくみを理解するための10章"のASCアセンブラでプログラムを考えようと思いましたが、8086との違いが大きいのではじめから8086アセンブラで考えます。


はじめに思いついたのは、前に考えた回路を、ANDとORとNOTの命令で作ることです。
だけど、これだと"program"は逆さまにできても、"tomato"はできません。
"tomato"にはまた別のプログラムがいります。

細山田さんのやつのように、キーボードで単語を打ち込んで、それを逆さまに表示するようなのにしたいです。


プログラムの流れを、

  1. キーボードからの単語をメモリに入れる。
  2. メモリを逆さまに読み出して画面に出す。

にわけて考えます。


まず、キーボードからの単語をメモリに入れる命令を調べました。

押されたキーを読み取る命令は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になりました。
できました!!

満足したので電源ボタンを長押しして終了させました。☠

scheme

アセンブラは"コンピュータのしくみを理解するための10章"があったので順調にいきました。
次はschemeのプログラムが動くようにがんばります。schemeも本があればいいのですが。