0

現在、メイン データ セグメント、スタック セグメント、および API が存在するセグメントの 3 つのメモリ セグメントがあります。次の命令はデータ セグメントから実行され、cursorRow とwelcomeMsg のアドレスをプッシュしてから、API セグメント内の関数を far 呼び出します。cursorRow 変数は、API 関数を呼び出しているメイン データ セグメントに存在します。呼び出しは次のようになります。

  push cursorRow
  push welcomeMsg
  call API_SEGMENT:API_printString

スタックを介して、API が存在するセグメント内の cursorRow を変更するにはどうすればよいですか? cursorRow は API から更新する必要があります。API 関数はデータ セグメントを変更しません。私は次のようなことを試しました:inc byte [ds:bp+8]add [ds:bp+8], 1. 呼び出される API プロシージャは次のとおりです。

printStringProc:
    push bp 
    mov bp, sp
    mov si, [bp+6]
    .printloop:
        lodsb
        cmp al, 0
        je printStringDone
        mov ah, 0x0E ; teletype output
        mov bh, 0x00 ; page number
        mov bl, 0x07 ; color (only in graphic mode)
        int 0x10
        jmp .printloop
    printStringDone:
    ; move the cursor down
    mov ah, 02h ; move cursor
    mov dh, [bp+8]
    mov dl, 0 ; column
    mov bh, 0 ; page number
    int 10h

    add [ds:bp+8], 1

  pop bp
  retf 

文字列を出力しますが、cursorRow 変数は正しく更新されません。私の問題について十分に明確であることを願っています。説明するのは難しいです:D

4

2 に答える 2

0

これは、cursorRow自体ではなく、cursorRowへのポインタを渡したためです。あなたが実行するとき

inc [ds:bp+8]

あなた:1)の値を取得しますbp。2)8を追加します。3)結果がのポインタであると想定しdsます。4)そこに格納されている値(cursorRowへのポインタ)をインクリメントします。ポインタはスタックに格納されているため、これを行うとポインタがインクリメントされます。あなたがする必要があるのは、スタックからポインタを外し、ポイントする値インクリメントすることです。

mov bx, [bp+8]
inc [bx]

このコード:1)の値を取得しますbp。2)8を追加します。3)結果がのポインタであると想定しssます。4)そこに格納されている値(cursorRowへのポインタ)をにロードします。5)のポインタであるbxと想定します。6)そこに格納されている値(cursorRowの値)をインクリメントします。bxds

于 2011-07-12T04:02:51.073 に答える