读书人

程序编译通过但运行时出有关问题忘

发布时间: 2013-01-21 10:15:39 作者: rapoo

程序编译通过,但运行时出问题,忘高手帮忙!
代码如下,编译通过,但是运行时系统挂掉。注释掉mov ebx,[eax]这行代码,则问题消失。请问高手是何原因?难道该语句导致程序代码指针混乱?
.386P
DATA_SEGSEGMENTUSE16
ADD1DD0
ADD2dd0
DATA_SEGENDS

STACK_SEGSEGMENTPARA STACK
DB1024DUP(0)
STACK_SEGENDS
CODE_SEG SEGMENT USE16
ASSUME CS:CODE_SEG,DS:DATA_SEG

STARTPROC
MOVEAX, ADD1
ADDEAX, 0CH
MOVEBX, [EAX]
MOVAX, 4C00H
INT21H
STARTENDP

CODE_SEGENDS

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

读书人网 >汇编语言

热点推荐