代码如下,编译通过,但是运行时系统挂掉。注释掉mov ebx,[eax]这行代码,则问题消失。请问高手是何原因?难道该语句导致程序代码指针混乱?
.386P
DATA_SEG SEGMENT USE16
ADD1 DD 0
ADD2 dd 0
DATA_SEG ENDS
STACK_SEG SEGMENT PARA STACK
DB 1024 DUP(0)
STACK_SEG ENDS
CODE_SEG SEGMENT USE16
ASSUME CS:CODE_SEG,DS:DATA_SEG
START PROC
MOV EAX, ADD1
ADD EAX, 0CH
MOV EBX, [EAX]
MOV AX, 4C00H
INT 21H
START ENDP
CODE_SEG ENDS
END START
------解决方案--------------------------------------------------------
你访问了不该访问的地址,在linux上应该给你一个段错误!
你的数据段只有add1与add2都是双字,共计4个字节
MOV EAX, ADD1 将ADD1的地址放入内存
ADD EAX, 0CH ADD1的地址加0cH,即ADD1后的第十二个字节,这里明显超出了你的data段的长度
MOV EBX, [EAX] 此时eax里的值 已然是个非法指针了,系统不会让你乱搞的,所以果断死掉
MOV AX, 4C00H
如果你是要将EBX里的值放入ADD2可以修改
MOV EAX, ADD1 为 MOV EAX, ADD2 并删除ADD EAX, 0CH
或 修改
ADD EAX, 0CH 为 ADD EAX, 02H
------解决方案--------------------------------------------------------
其实,是没有设置好 ds 而致 mov eax, ADD1 访问了错误的地方,eax 不是预想中的 0 了,后面用它来做访问地址就出非法访问的错了。程序的开头加上 ds 的设置,这里对 eax 的计算和后续使用还是正常:
mov ax, data_seg
mov ds, ax