0

さて、ここで大きな問題が発生しました。このコードは機能するはずです。私が書いたのではなく、先生がくれたものです。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 ビットを実行しています。

4

0 に答える 0