汇编数据段地址问题 看我的源代码,从反汇编的代码中可以看到段地址DS应该为075A 但是D命令查看的结果不是
展开全部
DOS的EXE文件加载时,对CS的初始化处理是将它指向入口语句对应的那个代码段段地址,而DS,ES,SS是相同的,它们都指向加载这个程序时的程序段前缀(PSP)的段地址,而不是你程序中定义的数据、堆栈等各个段的段地址。用户必须自己编写代码,在程序运行时将相应的段地址传送到DS等。
从你的程序可以看到,你程序里用DATA SEGMENT 定义的这个DATA段,加载后的段地址是071A。但DS并不是在程序加载时就直接指向它。你的程序开始运行以后,要用两条指令,将076A传送到DS。
只有在这两条指令执行过以后,DS才会变成076A。
你刚加载了程序、尚未运行时查看,DS还没有改成076A。这时的075A实际是PSP的段地址。
从你的程序可以看到,你程序里用DATA SEGMENT 定义的这个DATA段,加载后的段地址是071A。但DS并不是在程序加载时就直接指向它。你的程序开始运行以后,要用两条指令,将076A传送到DS。
只有在这两条指令执行过以后,DS才会变成076A。
你刚加载了程序、尚未运行时查看,DS还没有改成076A。这时的075A实际是PSP的段地址。
追问
可是我运行了以后再输入-D DS:0,依然显示的是075A呢,我用T命令单步执行,能看到DS=076A,但程序运行完了以后用D命令查看DS,还是075A。
追答
程序开始运行前,DS不指向你的DATA段。
在你程序开始运行,对DS赋过值以后,DS才指向你的DATA段。
此后,在程序运行中,只要不重新给DS赋值,它就不会变。
当程序执行了4CH功能调用,结束运行后,DS也不再指向你的DATA段。
展开全部
在程序执行之前,DS的内容并不是指向数据段,程序前两句
MOV AX,076A (MOV AX,DATA)
MOV DS,AX
就是实现数据段寄存器DS初始化的
可以看到数据段段地地址为076A
你可以在debug j.exe之后
用r命令看一下寄存器内容
用t命令单步运行一下,观察寄存器变化
在DS正确初始化之后
再用D DS:0查看
MOV AX,076A (MOV AX,DATA)
MOV DS,AX
就是实现数据段寄存器DS初始化的
可以看到数据段段地地址为076A
你可以在debug j.exe之后
用r命令看一下寄存器内容
用t命令单步运行一下,观察寄存器变化
在DS正确初始化之后
再用D DS:0查看
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
075A:0000 ;ds就是075a
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询