tamtam 发表于 2024-4-23 19:47:44

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

本帖最后由 tamtam 于 2024-4-23 20:48 编辑

- 编写源程序时定义的段必须至少按16字节对齐,为什么定义加载器的头部的段不需要按16字节对齐?
- program_length 声明为 dd 是因为源程序可能很大,为什么 section.code_1.start 也要用 dd 声明?是因为section.code_1.start有可能超过单字吗?


站长 发表于 2024-4-23 20:17:04

如果段定义未指定align子句,则默认是按16字节对齐的,所以头部段作为第一个段不需要指定对齐。从另一方面来说,你应该把程序加载到一个16字节对齐的内存地址处,所以它自然就是16字节对齐的。

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

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

tamtam 发表于 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 字节对齐的。

tamtam 发表于 2024-4-23 20:31:11

本帖最后由 tamtam 于 2024-4-23 20:35 编辑

站长 发表于 2024-4-23 20:17
如果段定义未指定align子句,则默认是按16字节对齐的,所以头部段作为第一个段不需要指定对齐。从另一方面 ...
老师,这个默认16字节不对,下面的图片不是默认按4字节对齐吗

站长 发表于 2024-4-23 22:24:16

tamtam 发表于 2024-4-23 20:31
老师,这个默认16字节不对,下面的图片不是默认按4字节对齐吗

我说错了,是4bytes.
页: [1]
查看完整版本: x86汇编第二版 第九章 硬盘和显卡的访问控制——用户程序头部疑问