4

次の 8085 アセンブリ コードを説明しようとしています。

(IDE 内の仮想キーボードから) 2 つの数字を要求し、それらを LED 7 と 8 に表示する次のコードがあります。

.ORG 0000

CALL DATA
MOV C,A
CALL PRNT

CALL DATA
MOV E,A
CALL PRNT

MVI D,00H
MOV L,E
MVI H,00H

MOV A,C
DCR A
JUMP:
DAD D
DCR A
JNZ JUMP

MOV A,L
DAA
JMP IMPR

RET

DATA:
MVI A,00000000B
OUT 00H
IN 00H
RLC
RLC
RLC
RLC
ANI F0H
MOV B,A
MVI A,00000000B
OUT 00H
IN 00H
ANI 0FH
ORA B
RET

IMPR:
MOV B,A

ANI F0H
RLC
RLC
RLC
RLC
CALL NUMZ
OUT 06H
MOV A,B
ANI 0FH
CALL NUMZ
OUT 07H
RET

NUMZ:
CPI 00H
JNZ ONE
MVI A,01110111B
JMP EXIT

ONE:
CPI 01H
JNZ TWO
MVI A,01000100B
JMP EXIT

TWO:
CPI 02H
JNZ THREE
MVI A,00111110B
JMP EXIT

THREE:
CPI 03H
JNZ FOUR
MVI A,01101110B
JMP EXIT

FOUR:
CPI 04H
JNZ FIVE
MVI A,01001101B
JMP EXIT

FIVE:
CPI 05H
JNZ SIX
MVI A,01101011B
JMP EXIT

SIX:
CPI 06H
JNZ SEVEN
MVI A,01111011B
JMP EXIT

SEVEN:
CPI 07H
JNZ EIGHT
MVI A,01000110B
JMP EXIT

EIGHT:
CPI 08H
JNZ NINE
MVI A,01111111B
JMP EXIT

NINE:
CPI 09H
JNZ SAL
MVI A,01001111B
JMP EXIT

EXIT:
RET

PRNT私の質問にとって重要ではないため、含めません。

どちらがプログラムの開始かを理解.ORG 0000しています - それBEGINは Pascal のようなものです。

CALL DATAアキュムレータを 2 進数のゼロで埋めて (?) ポート 0 (16 進数で 00H) に表示するサブルーチンで、(仮想キーボードから) 数値を取得、ビット シフト操作で左に回転します。

私の質問はなぜですか?そうすることのポイントは何ですか?利点は何ですか? ウィキペディアでそれについて読んだことがありますが、まだわかりません。このコードで何をし、なぜ必要なのですか?

4

1 に答える 1

7

サブルーチンは 2 つのDATAASCII 10 進文字をロードし、それらを 2 桁のBCD値に形成します。最初の文字を 4 ビット左にシフトし、LS 4 ビットのみを保持してから、2 番目の文字の LS 4 ビットを結果の LS 4 ビットに入れます。

C では、これは次とほぼ同等です。

char c = getchar();             // get first ASCII decimal character
char result = (c << 4) & 0xf0;  // shift into MS nybble of result and mask
c = getchar();                  // get second ASCII decimal characters
result = result | (c & 0x0f);   // mask and inset into LS nybble of result
return result;

ASCII 10 進文字の LS ニブル以外をすべてマスクすると、ASCII '4' = 0x34 => 0x04 のように 10 進数に相当することに注意してください。


これを明確にするために、ユーザーが数字「69」を入力したときに何が起こるかを段階的に示す図を描きました。つまり、ASCII の「6」に続いて ASCII の「9」を入力すると、2 つの文字がマスクされて結合されます。数 69 の BCD 表現を与える:

ここに画像の説明を入力

于 2011-10-12T08:42:15.200 に答える