2016-09-15 11 views
3

次は私が分析し、作業をループする方法を理解しようとしていますループコードの一部です:アセンブリのx86 MASMループ分析

;the ecx register is the loop counter 

    mov ecx,6 
    mov edx, offset space 
myloop: 
    mov eax,ecx 
    dec eax 
    call writedec 
    call writestring 
loop myloop 
    call crlf 

    mov ecx,6 
    mov edx, offset space 
myloop2: 
    mov eax,6 
    sub eax, ecx 
    call writedec 
    call writestring 
loop myloop2 

私の質問は以下のとおりです。

  1. offset spaceは何を意味するのでしょうか?
  2. mov edx, offset spaceの意味は?
  3. offset spaceがどのように情報源ですか?
  4. レジスタecxをレジスタeaxに移動するにはどうすればよいですか?
  5. はなぜoffset spaceソースと登録edx先ですか?

は、すべてのあなたの助けをありがとうございました。

+0

"オフセットスペース"は、コードで前に定義した変数/定数のように見えます。 "mov edx、offset space"は変数の値をedxレジスタにコピーします –

+0

私はお詫びしますが、それがどのように変数であるのか分かりません。私は組立がとても新しいです。ありがとう –

+3

あるレジスタを別のレジスタに移動する方法がわからない場合は、質問をする前に実際に本またはチュートリアルを読む必要があります。それはあなたが最初に学ぶことです。 – interjay

答えて

1

offset演算子は、場所が属するセグメント(MOVの場合はDS)の先頭からの相対的なメモリ位置のオフセットを返します(here参照)。 spaceはおそらくコードのどこかで定義された変数であるため、offset spaceはその変数のセグメントの先頭(通常はDSデータセグメント)に対するバイト数を返します。すなわち

mov edx, offset spaceedxレジスタに格納する(タイプDWORDの、32ビット)space変数へのポインタをコピーします。 edxに配置された理由は、writedecルーチンとwritestringルーチンにあります。あなたは求めているループ、ecxレジスタの出番それはだについては

loop命令がチェックする前に、直ちに1である限りecxがそれを減少、ゼロではないとその先に移動するコードポインタが発生しますそれ。ループの値はあなたのコードのどこかでも使用されています。その理由はにコピーされ、他のコードではecxの値が変更されず、ループが乱れるからです。

+0

それはちょうど 'DS'です。 「EDS」ではない。保護されたモードのセグメントレジスタは、シフトされて追加される単純な値ではなく、セグメント*記述子*のグローバルディスクリプタテーブルにインデックスされます。あるレジスタを別のレジスタに移動する方法を尋ねる答えでは、セグメンテーションについては言及しません。通常のコード(16ビットではない)では、OFFSETはアドレスを取得するだけです。 –

+0

@PeterCordes:昨日、私は答えにあなたの反対意見を整理する の組み込みの "悪い"行為をしました。私はあなたがそれを承認することを願っています:-) – zx485

+0

@ zx485:それは一般的には良いことです。私は怠け者であり、自分でやっていませんでした。 (部分的には、アレックスが最初の段落の大半を取り除いてシンプルにしておくことを提案したかったので(セグメンテーションは16ビットモード以外ではほとんど無視できます)、それは良い編集ではありません。 –

関連する問題