0

好吧,我这里有个大问题。这段代码应该可以工作;不是我写的,是老师给我的。代码有点长,因为它是两个字符串之间的 concat 操作,并且它还有两个 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。这就是为什么假设这是问题所在。

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

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

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

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

4

0 回答 0