1

「show_msg」機能が正しく動作しないのはなぜですか?

org 100h

push str1
call show_msg
pop ax

mov ah, 4Ch
int 21h

show_msg:
mov ah, 9
mov bx, sp ;in 16bit bx is the only register that can act as a pointer (besides di and si)
mov dx, [bx]
int 21h
ret


str1 db 'Hello world!$'
4

3 に答える 3

5

ほとんどの場合、関数へのエントリに戻りコードのアドレスが含まれているためです。これは、このプログラムの場合、最初にある[sp]アドレスになります。pop axに変更mov dx, [bx]してみてくださいmov dx, [bx+2]。これにより、関数へのエントリの前にプッシュされた引数の値が取得されます。

于 2012-05-01T09:08:47.893 に答える
2

あなたのコードには根本的な欠陥があります。

まず、bp はポインターとしても使用できます。

bx レジスタではなく、bp レジスタを使用してスタックにインデックスを付ける必要があります。[bp] フォームはデフォルトで SS セグメントを使用しますが、[bx] フォームはデフォルト セグメントとして DS を使用します。これは、DS != SS の場合、[bx] を使用するとスタックにプッシュされた値を読み取るのではなく、他の未定義の値を読み取ることを意味します。

したがって、正しいバージョンは次のとおりです。

show_msg:
  mov bp,sp
  mov ah,9
  mov dx,[bp+2]
  int 21h
  ret

関数にローカル ストレージが必要な場合、一般的な形式は次のとおりです。

function:
  mov bp,sp
  sub sp,amount of space for local storage

  some code, parameters are [bp+offset], local data are [bp-offset]

  mov sp,bp
  ret
于 2012-05-04T10:47:23.193 に答える