2

ポインタ引数をプロシージャに渡すにはどうすればよいですか?

2 つの引数を持つ関数を作成する必要があります。

  1. 単語配列
  2. 配列のサイズ

この関数は、配列のサイズの配列を取得し、列を合計します。

それが私がコーディングしたものです:

.MODEL 小
.スタック 64

; +===============================+
; | | データ |
; +===============================+

。データ
array1 dw 1,2,3,4
array1size dw 4
結果dw?
アドレスdw?
; 印刷する
TMP dw 0 ; 一般的な一時変数 ..
。コード

addNumbers プロシージャ
; 結果をリセット
    結果
; スタックを使用
    移動 bp,sp
; 数値配列を取得
    mov bx,[bp+2]
; 数字の数を取得する
    mov cx,[bp+4]
; 追加する
追加:
    [di],bx を追加
    株式会社bx; 次のbxに行く
ループ追加
    レット 2
終わり

; 始める
始める:
    移動斧、@DATA
    mov ds,ax
; 文字列を設定する
    プッシュ array1size
    プッシュ オフセット配列 1
    addNumbers を呼び出す
; 印刷する
    mov dx:ax,結果
    printNumber を呼び出す
    動くあ、4ch
    移動,0
    整数 21H
終了開始

問題-結果にオフセットポインター(ここcs:0000ではcs:0001cs:0002cs:00031234

このため、結果は 10 ではなく 6 になります。

誰かが私を助けることができますか?

4

1 に答える 1

2
INC BX

もちろん、BX のポインターに 1 (バイト) を追加します。1 つの WORD を移動する必要がある場合は、単語のサイズを追加する必要があります。それが2バイトだとすると、必要です

ADD BX, 2

の代わりにINC

あなたの他の問題は、指している値を追加するので[BX]はなく、ポインター自体を追加することBXです。AX合計を計算するなど、予備のレジスタを使用することもできます。

    MOV  AX,0
adding:
    ADD  AX,[BX]
    ADD  BX,2
    LOOP adding
    MOV  [result],AX

    RET  4
于 2012-05-31T16:52:05.800 に答える