0

だから私は実際にジャンプがどのように機能するかを理解するのに苦労しています、

例を挙げましょう。DXの値が5より大きい場合、L1をループして、L2にジャンプするので、これを実行しましたが、コードはL2で読み取る必要のあるコードの行数をどのように認識していますか?

MOV DX,0
    MOV CX,10
L1:
    ADD DX,30H
    MOV AH,02H
    INT 21H
    SUB DX,30H
    ADD DX,1        
    CMP DX,5
    JA L2

LOOP L1

複数の操作、つまりA、B、Cを実行したい場合、L2にジャンプした後、3番目の操作の後にL2を終了するにはどうすればよいですか?

L2:
   A
   B
   C
   ;Go back into the Loop L1 , How can i terminate L2 here ?
4

3 に答える 3

2

私の 80x86 アセンブリ メモリは少し古い (20 年) ですが、 CX を変更しない場合は、 L2: コードから LOOP L1 を呼び出すことができると思います。

LOOP の最後にいる場合 (LOOP は CX をデクリメントするため)、10 回目に JA to L2 を行うと L1 に戻りません。

于 2012-09-21T16:55:03.017 に答える
2

CPU は、各命令を一度に 1 つずつ読み取り、実行します。制御フローは、フローを変更する命令 (ジャンプ命令など) に遭遇しない限り、線形になります。

流れを変えて元の場所に戻りたい場合はCALL、ジャンプではなく命令を使用し、CPU がRET命令を実行したときに元に戻る必要があります。

ただし、例の L1 ラベルに移動する場合はJMP L1、L2 の最後に命令を配置するだけです。

于 2012-09-21T16:56:34.837 に答える
1

この言語の詳細はわかりませんが、すべてのアセンブリ言語は基本的に同じように機能します。

  • L2 コードが関数の場合、つまり、L2 の実行が完了した後で L2 を呼び出した関数 (呼び出し元関数) に戻りたい場合は、CALL を使用して L2 の最初の命令に到達する必要があります。L2 の最後の命令はリターンになります。

  • 代わりに、L2 の後、常に L1 の先頭に戻りたい場合は、L2 コードの最後にあるラベル L1 への無条件 JUMP を使用する必要があります。

通常、ほとんどのアセンブリ言語では、ラベルに対して JUMP または CALL のみを使用します。使用する JUMP または CALL 命令が絶対アドレスではなく相対オフセットに依存している場合、アセンブラーはこれが変換される正または負の行オフセットの数を計算します。そのオフセットが大きすぎると、アセンブラはアセンブル時にエラー メッセージを生成します。

于 2012-09-21T17:04:52.423 に答える