さて、ここで大きな問題が発生しました。このコードは機能するはずです。私が書いたのではなく、先生がくれたものです。2 つの文字列間の連結操作であり、さらに 2 つの proc があるため、コードは少し長くなりますが、これは別の proc から呼び出されない唯一の proc であるため、これを個別にデバッグしています。
.MODEL LARGE
.386
.STACK 200h
.DATA
_MAX_CARACTERES_ EQU 30
__AUX_CADENA_ DB _MAX_CARACTERES_ dup(?), '$'
cad1 DB "primer cadena", '$', 37 dup(?)
cad2 DB "segunda cadena", '$', 36 dup(?)
cad3 DB _MAX_CARACTERES_ dup(?), '$'
.CODE
BEGIN: .startup
mov AX, @DATA
mov DS, AX
FINIT
;;;;;;;;;;;;;;;STRLEN;;;;;;;;;;;;;;
STRLEN PROC
;mov bx, 0
;JMP STRL01
;STRL01:
;cmp BYTE PTR[SI+BX], '$'
;JS STREND
;inc BX
;jmp STRL01
;STREND:
retn
STRLEN ENDP
;;;;;;;;;;;;MAIN;;;;;;;;;;;;;
mov AX, @DATA
mov es, ax
mov si, OFFSET cad1
mov di, OFFSET __AUX_CADENA_
call STRLEN
;call COPIAR
;mov si, OFFSET cad2
;mov di, OFFSET __AUX_CADENA_
;call CONCAT
;mov si, OFFSET __AUX_CADENA_
;mov di, OFFSET cad3
;call COPIAR
mov AX, 4C00h
int 21h
END BEGIN
ご覧のとおり、問題の場所を見つけるために行にコメントを付けています。問題はRET命令にあるという結論に達しました。プログラムは適切にリンクされていますが、実行すると、次の Windows ダイアログが表示されます。
「NTVDM CPU が不正な命令に遭遇しました。CS:0712 IP:0927 OP:ff 7f 00 00 00 アプリケーションを終了するには、[閉じる] を選択してください。」
コードはこの部分でうまく機能します。
mov AX, @DATA
mov es, ax
mov si, OFFSET cad1
mov di, OFFSET __AUX_CADENA_
それまで
call STRLEN
次に、STRLEN 内でコメント化されていない唯一の命令は RET です。だからこそ、これが問題であると仮定します。
私はたくさん読んでいますが、まだ問題を見つけることができませんでした。
Web のどこかで、スタックが破損しているため、proc が「戻る」と、プロセッサが理解できない無効なメモリ アドレスに戻ると読んだことがあります。
誰かがこれで私を助けてくれたらいいのにと思います。どうすればいいのかわかりません。たくさん試しました。説明がわかりにくかったり、情報が不足していたりしたら、何でも聞いてください。どうもありがとうございました。
ところで、私は Windows XP Mode 32 ビットを実行しています。