2017-06-07 18 views
1

私はアセンブリー8086で私の索引付けに問題があります。私はCから呼び出すアセンブリーのプロシージャーを持っています。このlong int *arr_ptr[3]のように定義されたタイプlong intのポインターの配列を取ると、コードはこのようになります(私はSI )私の列のポインタであることが私の行ポインタとDIする:cntが2である最後の行アセンブリ8086でインデックス作成作業を行うにはどうすればよいですか?

MOV SI,[BP+6] ;now si points to the first row 
MOV DI,[SI]  ;now DI is pointing to the first row 
       ; and at the first column column 
ADD SI,2  ;here i can move the SI pointer to the next row, 
       ; but i want to do this in a loop so i thought 
       ; ill define a variable cnt in my data and do this 
MOV DI,[SI+cnt] 

ADD SI,2私が何ができると同じではありませんか?私はちょうど私の行列をループするだけです。

+0

Cは16ビットコードを生成しますか? 'long int * arr_ptr [3]'のポイントは何ですか?それは32ビットですか? –

+0

申し訳ありませんが、どうすればわかりますか? – user3133165

+0

それはあなたが意味するものなら、私は.SMALLモデルで働いています – user3133165

答えて

1

まず、行数を渡すか(変数を前提とします)、行ポインタをNULL ptr(自分の設定)で終了する必要があります。または、必要なすべての情報を含む構造体を構築します。行数、data addr、およびそのptrを処理ルーチンに渡します。行数がプロトタイプはfunc(long int *arr_ptr[], unsigned rowcnt);と処理コードできたループになる可能性があります引数として渡された場合に代わりに

mov si,[bp+6] 
    jmp short rowloopentry 
rowloop: 
    << process row data pointed to by di >> 
rowloopentry: 
    mov di,[si]     ;get next row data ptr, and advance index 
    add si,2 
    test di,di      ;process next row if not at end 
    jnz rowloop 

:あなたはNULLが行PTRSを終了しましたが、アセンブリコードは次のようになりますと仮定すると、

上記のように、特定のプロセッサアーキテクチャの最適化は無視されます。

関連する問題