現在、メイン データ セグメント、スタック セグメント、および 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