組み込みシステム-手順

プログラムの流れは、制御転送命令が実行されない限り、ある命令から次の命令へと順番に進みます。アセンブリ言語のさまざまなタイプの制御転送命令には、条件付きまたは無条件のジャンプと呼び出し命令が含まれます。

ループとジャンプの命令

8051でループ

一連の命令を特定の回数繰り返すことを、 loop。指示DJNZ reg, labelループ操作を実行するために使用されます。この命令では、レジスタは1だけデクリメントされます。ゼロでない場合、8051はラベルで参照されているターゲットアドレスにジャンプします。

レジスタには、ループの開始前の繰り返し回数のカウンタがロードされます。この命令では、レジスタのデクリメントとジャンプの決定の両方が1つの命令に結合されます。レジスタはR0〜R7のいずれかです。カウンターはRAMの場所にすることもできます。

Multiply 25 by 10 using the technique of repeated addition.

Solution−乗算は、被乗数を乗数と同じ回数だけ繰り返し加算することで実現できます。例えば、

25 * 10 = 250(FAH)

25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250

MOV A,#0             ;A = 0,clean ACC 
   MOV R2,#10           ; the multiplier is replaced in R2 
   Add A,#25            ;add the multiplicand to the ACC 
	
AGAIN:DJNZ R2, 
AGAIN:repeat  until R2 = 0 (10 times) 

   MOV R5 , A           ;save A in R5 ;R5 (FAH)

Drawback in 8051 −命令によるループアクション DJNZ Reg label256回の反復のみに制限されています。条件付きジャンプが行われない場合、ジャンプに続く命令が実行されます。

ループ内でループする

別のループ内でループを使用する場合、それは nested loop。最大カウントが256に制限されている場合、2つのレジスタを使用してカウントを保持します。したがって、このメソッドを使用して、アクションを256回以上繰り返します。

Example

-にプログラムを書く

  • 値55Hでアキュムレータをロードします。
  • ACCを700回補完します。

Solution− 700は255(任意のレジスタの最大容量)より大きいため、2つのレジスタを使用してカウントを保持します。次のコードは、カウントに2つのレジスタR2とR3を使用する方法を示しています。

MOV A,#55H            ;A = 55H 
	
NEXT: MOV R3,#10         ;R3 the outer loop counter 
AGAIN:MOV R2,#70         ;R2 the inner loop counter 

   CPL A                 ;complement

その他の条件付きジャンプ

次の表に、8051で使用される条件付きジャンプを示します。

命令 アクション
JZ A = 0の場合にジャンプ
JNZ A≠0の場合にジャンプ
DJNZ レジスタ≠0の場合、デクリメントとジャンプ
CJNE A、データ A≠データの場合にジャンプ
CJNE reg、#data バイト≠データの場合にジャンプ
JC CY = 1の場合にジャンプ
JNC CY≠1の場合にジャンプ
JB ビット= 1の場合にジャンプ
JNB ビット= 0の場合にジャンプ
JBC ビット= 1の場合にジャンプし、ビットをクリアします
  • JZ (jump if A = 0)−この命令では、アキュムレータの内容がチェックされます。ゼロの場合、8051はターゲットアドレスにジャンプします。JZ命令はアキュムレータにのみ使用でき、他のレジスタには適用されません。

  • JNZ (jump if A is not equal to 0)−この命令では、アキュムレータの内容がゼロ以外であることがチェックされます。ゼロでない場合、8051はターゲットアドレスにジャンプします。

  • JNC (Jump if no carry, jumps if CY = 0)−フラグ(またはPSW)レジスタのキャリーフラグビットは、「JNCラベル」をジャンプするかどうかを決定するために使用されます。CPUは、キャリーフラグを調べて、キャリーフラグが発生しているかどうかを確認します(CY = 1)。上げられていない場合、CPUはラベルのアドレスから命令のフェッチと実行を開始します。CY = 1の場合、ジャンプはしませんが、JNCの下の次の命令を実行します。

  • JC (Jump if carry, jumps if CY = 1) − CY = 1の場合、ターゲットアドレスにジャンプします。

  • JB (jump if bit is high)

  • JNB (jump if bit is low)

Note −すべての条件付きジャンプは短いジャンプであることに注意する必要があります。つまり、ターゲットのアドレスは、プログラムカウンタの内容から–128〜 +127バイト以内である必要があります。

無条件ジャンプ命令

8051には2つの無条件ジャンプがあります-

  • LJMP (long jump)− LJMPは3バイトの命令で、最初のバイトはオペコードを表し、2番目と3番目のバイトはターゲット位置の16ビットアドレスを表します。2バイトのターゲットアドレスは、0000からFFFFHまでの任意のメモリ位置へのジャンプを許可するためのものです。

  • SJMP (short jump)−これは2バイトの命令であり、最初のバイトはオペコードで、2番目のバイトはターゲット位置の相対アドレスです。相対アドレスの範囲は00HからFFHで、前方ジャンプと後方ジャンプに分けられます。つまり、現在のPC(プログラムカウンタ)のアドレスを基準にして、メモリの–128〜 +127バイト以内です。フォワードジャンプの場合、ターゲットアドレスは現在のPCから127バイトのスペース内にある可能性があります。後方ジャンプの場合、ターゲットアドレスは現在のPCから–128バイト以内にある可能性があります。

ショートジャンプアドレスの計算

すべての条件付きジャンプ(JNC、JZ、およびDJNZ)は、2バイトの命令であるため、短いジャンプです。これらの命令では、最初のバイトはオペコードを表し、2番目のバイトは相対アドレスを表します。ターゲットアドレスは常にプログラムカウンタの値を基準にしています。ターゲットアドレスを計算するために、ジャンプのすぐ下の命令のPCに2番目のバイトが追加されます。以下に示すプログラムを見てください-

Line   PC    Op-code   Mnemonic   Operand 
1      0000               ORG       0000 
2      0000  7800         MOV       R0,#003  
3      0002  7455         MOV       A,#55H0 
4      0004  6003         JZ        NEXT 
5      0006  08           INC       R0 
6      0007  04   AGAIN:  INC       A 
7      0008  04           INC       A 
8      0009  2477 NEXT:   ADD       A, #77h 
9      000B  5005         JNC       OVER 
10     000D  E4           CLR       A
11     000E  F8           MOV       R0, A 
12     000F  F9           MOV       R1, A 
13     0010  FA          MOV       R2, A 
14     0011  FB           MOV       R3, A 
15     0012  2B   OVER:   ADD       A, R3 
16     0013  50F2         JNC       AGAIN 
17     0015  80FE HERE:   SJMP      HERE 
18     0017             END

後方ジャンプターゲットアドレスの計算

フォワードジャンプの場合、変位値は0〜127(16進数で00〜7F)の正の数です。ただし、後方ジャンプの場合、変位は0〜–128の負の値です。

呼び出し手順

CALLは、サブルーチンまたはメソッドを呼び出すために使用されます。サブルーチンは、頻繁に実行する必要のある操作またはタスクを実行するために使用されます。これにより、プログラムがより構造化され、メモリスペースが節約されます。LCALLとACALLの2つの命令があります。

LCALL(ロングコール)

LCALLは3バイトの命令で、最初のバイトはオペコードを表し、2番目と3番目のバイトはターゲットサブルーチンのアドレスを提供するために使用されます。LCALLを使用して、8051の64Kバイトのアドレス空間内で使用可能なサブルーチンを呼び出すことができます。

呼び出されたサブルーチンの実行後のポイントに正常に戻るために、CPUはスタック上のLCALLのすぐ下にある命令のアドレスを保存します。したがって、サブルーチンが呼び出されると、制御はそのサブルーチンに移され、プロセッサはPC(プログラムカウンタ)をスタックに保存し、新しい場所から命令のフェッチを開始します。命令RET(return)は、サブルーチンの実行が終了した後、制御を呼び出し元に戻します。すべてのサブルーチンは、最後の命令としてRETを使用します。

ACALL(アブソリュートコール)

3バイトのLCALLとは対照的に、ACALLは2バイトの命令です。2バイトのうち11ビットのみがアドレスに使用されるため、サブルーチンのターゲットアドレスは2Kバイト以内である必要があります。ACALLとLCALLの違いは、LCALLのターゲットアドレスは8051の64Kバイトのアドレス空間内のどこにでも配置できるのに対し、CALLのターゲットアドレスは2Kバイトの範囲内にあることです。