|
6:Re: 続いてキー判定部 hideyosi 10/24 11:16 こんな実験をしてみた。 ------------------------------------------- ;文字コードとキースイッチコードの対応表 KEYTABLE: DB '0','1','2','3' ; DB 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 8, 9 ; DB 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 10, 0, 'A', 'S' ; DB 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V' ; DB 'B', 'N', 'M', ',', '.', '/', 0, '*' ----------------------------------------------- 例の、 MOV BH,0 MOV BL,AL MOV AL,[BX+KEYTABLE] の部分の理解。 この状態で、キーを押す。ESCキー。ESCキーのキースイッチ値は、 0x01。で、[BX+KEYTABLE]とかの場合は、KEYTABLEはラベルとなる。 ラベルは、ある特定のアドレスを文字に見立てただけなので、 実際にはアドレスに変換されるはず。(じゃ、仮に0x0200番地だと仮定してみる。) MOV BH,0 MOV BL,AL これによって、ESCキーが押された場合には、BXレジスタは、0x0001になる。で、 MOV AL,[BX+KEYTABLE] とやると、実際には、 MOV AL,[0x0001+0x0200] というようなことになる。で、実際の0x0201番地っていうのが、 DB '0','1','2','3' この二番目の要素。すなわち、「1」のアスキーコードになると・・・・ なるほどなるほど!!!! わかってきたぞ!!!! そうすると、例えば、一覧表をちゃんとした状態で、 MOV AL,[BX+KEYTABLE+1] なんてイタヅラをすると、全てのキーが一個づつずれるなんてこともできると!あと、 MOV BH,0 MOV BL,AL これは、そもそもアドレス(オフセット値)を指定するんだから、 16bitが必要なのでこうしているわけね。 ??? じゃ、なんでBXレジスタなのか? これは、「お作法で BX はメモリアドレスの指定に」ということなのかなぁ・・・・ 仮にだけど、これをワザとDXレジスタでやってみるとどうなるかな??? ・・・・あれれれ! コンパイルエラーになっちゃった。やっぱ、単純にお作法だけじゃなくて、こういう手のアドレス指定は、BXを使うもののようだね。 |