找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 76|回复: 4

x86汇编第二版 第九章 硬盘和显卡的访问控制——用户程序头部疑问

[复制链接]

1

主题

2

回帖

21

积分

新手上路

积分
21
发表于 2024-4-23 19:47:44 | 显示全部楼层 |阅读模式
本帖最后由 tamtam 于 2024-4-23 20:48 编辑

- 编写源程序时定义的段必须至少按16字节对齐,为什么定义加载器的头部的段不需要按16字节对齐?

- program_length 声明为 dd 是因为源程序可能很大,为什么 section.code_1.start 也要用 dd 声明?是因为section.code_1.start有可能超过单字吗?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

97

主题

115

回帖

1483

积分

管理员

积分
1483
发表于 2024-4-23 20:17:04 | 显示全部楼层
如果段定义未指定align子句,则默认是按16字节对齐的,所以头部段作为第一个段不需要指定对齐。从另一方面来说,你应该把程序加载到一个16字节对齐的内存地址处,所以它自然就是16字节对齐的。

section.code_1.start也要用dd声明没有特别的原因,只因为程序特别特别大的话,一个字无法容纳它的大小。通常来说,程序的原始尺寸是可以非常大的,但可以分批次加载和执行,而不是一次性全部加载。但本书未使用这项技术,只不过我当时想的是应该考虑到这种情况。

就本书的实际情况而言,用dw也没问题。

1

主题

2

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-4-23 20:21:24 | 显示全部楼层
本帖最后由 tamtam 于 2024-4-23 20:55 编辑
站长 发表于 2024-4-23 20:17
如果段定义未指定align子句,则默认是按16字节对齐的,所以头部段作为第一个段不需要指定对齐。从另一方面 ...

谢谢老师,明白了。  
- 因为程序是加载到一个 16 字节对齐的内存地址处,头部前面部分都为 16 字节对齐的,所以不需要`align=16`。`align=16`的作用是在前面的段内填充数据来保证段在内存中的起始物理地址是 16 字节对齐的。

1

主题

2

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2024-4-23 20:31:11 | 显示全部楼层
本帖最后由 tamtam 于 2024-4-23 20:35 编辑
站长 发表于 2024-4-23 20:17
如果段定义未指定align子句,则默认是按16字节对齐的,所以头部段作为第一个段不需要指定对齐。从另一方面 ...

老师,这个默认16字节不对,下面的图片不是默认按4字节对齐吗

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

97

主题

115

回帖

1483

积分

管理员

积分
1483
发表于 2024-4-23 22:24:16 | 显示全部楼层
tamtam 发表于 2024-4-23 20:31
老师,这个默认16字节不对,下面的图片不是默认按4字节对齐吗

我说错了,是4bytes.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-5-4 02:39 , Processed in 0.233426 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表