当前位置: 代码迷 >> 汇编语言 >> 程序编译通过,但运行时出有关问题,忘高手帮忙
  详细解决方案

程序编译通过,但运行时出有关问题,忘高手帮忙

热度:5744   发布时间:2013-02-26 00:00:00.0
程序编译通过,但运行时出问题,忘高手帮忙!
代码如下,编译通过,但是运行时系统挂掉。注释掉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
  相关解决方案