2012-03-10 23 views
0

を使用して文字列をループ私は議会についての本を読んで、それは次のコードを持っている:私たちが必要とすることを書かれているアセンブリ - 担当者

.DATA 
    string1 db ’abcdfghi’,0 
    strLen EQU $ - string1 
    string2 db ’abcdefgh’,0 
.CODE 

.STARTUP 
    mov AX,DS ; set up ES 
    mov ES,AX ; to the data segment 
    mov ECX,strLen 
    mov ESI,string1 
    mov EDI,string2 
    cld ; forward direction 
    repe cmpsb 
leaves ESI pointing to g in string1 and EDI to f in string2. Therefore, adding 
    dec ESI 
    dec EDI 
leaves ESI and EDI pointing to the last character that differs. Then we can use, 
ja str1Above 

を:leaves ESI pointing to g in string1 and EDI to f in string2.

becuase

dec ESI 
dec EDI 

しかし、なぜですか? ESIの 'f'に、EDIの 'e'に到着すると、repeの条件が満たされず、ループが終了します。 'f'はESIで、 'e'はEDIです。もう一度文字列をスキャンし続けると言うのはなぜですか?

答えて

0

方向フラグDFEFLAGSレジスタにクリアされている場合は、ESIとEDIを後の比較終了インクリメントされています。したがって、dec命令はこれを補償しています。おもう。 repの文字列命令は、8086 'CISC'日からの二日酔いです。

1

REPEが動作する方法です:

  1. ECX = 0またはZeroflag = 0 - >アウト
  2. 12月ECX
  3. は、コマンド
  4. 増加(または減少)ESIとEDIを行います。バック1.

+ 1対応するようESIおよびEDIポイントへ

  • (または - 後方方向の場合には1)。

  • +0

    リピートまた、esi = edi、no?私たちのケースでは、esi <> ediのためループを終了し、ecx = 0ではないからです。 –

    +0

    本当にありがとう、ありがとう。要点は、出口条件が最初であるということでした。そのため、ポインタを調整する必要があります。 –

    関連する問題