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