主题:初学者不知这个小程序错在哪里,请求帮助!
zhyunz_2004
[专家分:0] 发布于 2007-06-16 11:16:00
那位朋友能帮我看一下下面的这段小程序错在什么地方?程序执行到底7行时系统提示出错。谢谢帮助。
assume cs:codesg
codesg segment
mov ax,2000h
mov ss,ax
mov sp,0
add sp,4
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax, 4c00h
int 21h
codesg ends
end
回复列表 (共9个回复)
沙发
小牛斑斑 [专家分:1210] 发布于 2007-06-16 12:18:00
add sp,4删除,逻辑错误
sp始终指向栈顶
板凳
OldTrier [专家分:0] 发布于 2007-06-16 13:50:00
我想你是在Debug下调试到源程序,否则不会说“第7行”。
第7行“pop ax”时系统提示出错,显然与Debug的堆栈使用机制有关。Debug使用用户栈栈顶外(低于栈顶地址)的若干字/双字数据单元作为临时数据区,用于存放T命令和P命令执行时的断点返回地址。
可能的出错原因是:当用T或P命令调试程序时,因POP AX指令之前没有PUSH指令(PUSH后再POP是安全的),POP指令的执行改变了栈顶位置,使断点返回地址出错,导致T(P)命令执行完用户当前指令后,未能返回到Debug程序的调试环境(例如控制进入到某数据区内,而该数据不是正确的机器码)引起CPU指令译码错误。
3 楼
OldTrier [专家分:0] 发布于 2007-06-16 14:04:00
与程序含有修改SS、SP的操作无关。但计算机“病毒”的制造者(直接用汇编语言编程或在高级语言程序中嵌入汇编语言指令)曾用在程序中加入修改堆栈与栈顶的指令来阻止对病毒程序的跟踪和破译。当年陈盈豪的mummy病毒(CIH病毒之前身)就用过这种技术。
4 楼
OldTrier [专家分:0] 发布于 2007-06-16 16:25:00
在Win2K/Debug下对你的程序进行了调试,看法如下:
1、是第5、6行指令“mov sp,0/add sp,4”使程序的堆栈区改在了段边界附近的地址敏感区,引起Debug运行出现异常。将“mov sp,0”中的0或“add sp,4”中的4改大一些即可解决问题。
2、向zhyunz_2004致欠。前次回复中,我的关于修改栈区后马上使用pop指令会导致Debug返回地址出错的说法不正确。喜欢用汇编语言编程的人有时会用POP指令来代替JMP指令以迷惑那些尚缺乏破译经验的盗窃他人程序者。
3、祝你进步。
5 楼
zhyunz_2004 [专家分:0] 发布于 2007-06-16 21:18:00
谢谢您的帮助!我觉得您说的也有道理。
这个程序运行到第7行时,系统提示:NTVDM CPU遇到了无效的指令。CS:0000,IP:0077 OP:fo 37 05 12 02.别人说这是由于内存中2000:0这一空间不是安全空间,系统禁止往里写数据。安全空间应为3000:0000,我将第3行的2000h改为3000h后,程序执行了pop ax后自动退出这一程序,而没有再执行pop ax的下一行,不知为什么?
向您请教!谢谢!
6 楼
zhyunz_2004 [专家分:0] 发布于 2007-06-16 21:28:00
回复5楼:
谢谢您!我按您说的试了一下,确实如此。但您说的“段边界附近的地址敏感区”我还是有点不明白,请教您。多谢!
7 楼
asmseeker [专家分:10] 发布于 2007-12-05 10:46:00
这个是王爽著汇编语言的第四章第一个程序,问题是sp的值太小,在做t单步中断的时候引起保护程序的问题,把他改成》=6就好了,在这里没有必要知道的太多,向下学就能找到答案。汇编支持网
8 楼
asmseeker [专家分:10] 发布于 2007-12-05 10:56:00
程序在实dos下没有问题
我来回复