首页
社区
课程
招聘
[旧帖] 关于加载exe文件的寄存器初始值 0.00雪花
发表于: 2014-5-30 20:44 4139

[旧帖] 关于加载exe文件的寄存器初始值 0.00雪花

2014-5-30 20:44
4139
一个8086汇编程序

assume cs:code
stack segment
	db 16 dup (0)
stack ends

code segment
start:	mov ax,234h
	push ax
	push ax
	push ax
	push ax
	push ax
	push ax
	push ax
	push ax
	mov ax,4c00h
	int 21h
code ends
end start


debug后:
         DS=0B2F    ES=0B2F   SS=0B3F   CS=0B40    IP=0000   SP=0000
那么ss和cs差的1,是不是就是栈段声明的16db空间?

执行第一个push ax后:
          DS=0B2F    ES=0B2F   SS=0B3F   CS=0B40    IP=0004   SP=FFFE

我知道压栈后,sp要减去2  所以从0000到fffe 能理解它。
但数据根本没往ss和cs之间的内存中放,那还开辟那段空间有何用呀?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
我了个去,DS SS ES CS这个是段寄存器,不是数据寄存器。因为实模式下CPU只能寻址1MB内存,因此使用分段内存管理机制,每个段是64KB。

实模式下访问Segment:Offset方式的地址时,实际访问到的物理地址是:(Segment SHL 4)+Offset

你的数据实际被存放在了(SS SHL 4)+SP的位置
2014-5-30 21:15
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我知道ss+sp,但sp初始值为什么不是f,而是0?
2014-5-30 21:21
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
因为你每PUSH一个16位数据入栈以后,SP都会-2。如果是0的话,0-2=0xFFFE 相当于省出一个2字节的内存空间
2014-5-30 21:30
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
重点是ss:sp和cs:ip之间的距离,一开始的正好10h,不就是程序开头16dup的空间吗?
可push后却没放入这段空间。
如果sp一开始为f,也就是说ss:sp==cs:ip-1 不就正好用到这段栈空间了吗?
2014-5-30 21:36
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
启动起来SP默认就是0,如果你想要让他是你想要的,你尽管赋值就行了。
段寄存器相当于是给你分了个64K的内存让你用,SP算是指针,指向这个段里的什么地方存放什么数据。
你可以这样

mov ax,stack
mov ss,ax
xor ax,ax
mov sp,ax

然后再调试一下看看
2014-5-30 21:55
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哦!我明白一些了。
在定义栈段时,只是给程序分配了那么多空间,隔开psp和代码段,毕竟stack segment写在code之前。而ss:sp并不一定要用那个空间,用不用取决于代码有没有明确赋值sp。

谢谢你一直帮我。
2014-5-30 22:05
0
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
8
1.首先我认为你的这个问题是有问题的,你主观上将stack和ss段寄存器联系在了一起,但事实上stack只是个名称,编译器不会因为你名称叫stack,就认定它的寄存器是ss,你程序中又没有赋值,它们两个凭什么联系在一起。

2.其次你就算把stack换成别的名称如data,定义的字节数也变下,ss和cs之间的距离仍然是16的整数倍。

所以我认为这是系统的原因,当时就是这么设计的。
2014-5-30 22:49
0
雪    币: 279
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你的栈段地址默认是ss:sp而你声明的stack段cpu只把它当数据,如果你要把stack声明为栈段,要使用如下指令mov si,stack
mov ss,si
2014-5-30 23:46
0
游客
登录 | 注册 方可回帖
返回
//