" NTVDM CPU遇到了非法指令"由RET指令引起的

时间:2014-11-06 02:36:45

标签: assembly tasm ntvdm

嗯,我在这里遇到了一个大问题。这段代码应该有效;我没有写,但我的老师给了我。代码有点长,因为它是两个字符串之间的连接操作,并且它有两个更多的proc,但这是唯一一个没有从另一个proc调用的,所以,我已经单独调试它了。 / p>

.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。这就是为什么假设这就是问题。

我已经阅读了很多,但我还没有找到问题。

在网络的某个地方,我已经读到堆栈已损坏,所以当proc"返回"时,它返回到无效的内存地址,这是处理器无法处理的理解。

拜托,我希望有人可以帮助我,我不知道该怎么做,我已经尝试了很多。 如果解释不清楚或信息不够,请问我需要什么。 非常感谢你。

哦,顺便说一下,我正在运行Windows XP Mode 32bits

0 个答案:

没有答案