computerline1z / writeos

Automatically exported from code.google.com/p/writeos
0 stars 0 forks source link

chapter3/2/loader.S #8

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
对于这个例子,我还存在一些疑问,主要是数据段和堆栈段��
�面的。
1、数据段:
/* Initialize data segment descriptor. */
    InitDesc LABEL_DATA, LABEL_DESC_DATA
读了例子之后发现,数据段的初始化是通过以上语句实现,��
�就是将LABEL_DATA的入
口地址与段描述符LABEL_DESC_DATA关联起来,具体在宏InitDesc中实
现。但在之前的
例子chapter3/1/loader.S 
并没引用数据段,而直接在显示字符串的部分显式的写入
“P”。如果本程序并未引入数据段但需要显示例子中的字符�
��,那该作如何改? (这
个问题有点钻牛角尖,但本人只是想加深理解,只需几行提��
�代码或解释就可以,谢谢)

2、堆栈段:
我始终没看明白堆栈段在这个例子里面的作用。

Original issue reported on code.google.com by linux...@gmail.com on 25 Sep 2008 at 7:04

GoogleCodeExporter commented 9 years ago
1. 
我想,大概把字符串放到代码段中(比如最后)也是可以的��
�不过你可能就要修改一些东西。
之所以要使用数据段,是因为在前面的 16 
位段中,只需要将代码段地址给 DS 即可,就是下面
语句:
    mov     %cs, %ax    /* Move code segment address(CS) to data segment */
    mov     %ax, %ds    /* register(DS), ES and SS. Because we have      */
    mov     %ax, %es    /* embedded .data section into .code section in  */
    mov     %ax, %ss    /* the start(metioned in the NOTE above).        */
这样数据和代码全部写在代码段中是没有问题的。

但是在 32 
位运行在保护模式的程序中,每个段是有自己的属性的,比��
�:
LABEL_DESC_CODE32:  Descriptor        0, (SegCode32Len - 1), (DA_C + DA_32)
最后的属性说明它是 32 
位代码段描述符,它的选择子是不能给 DS 
寄存器的。所以你如果想把字
符串放到代码段中,就必须自己再建一个数据段描述符,并��
�代码段的信息初始化它,还要一个数
据段选择子,这个工作并不比将数据段独立出来做的少。

如果你不想新建一个数据段描述符,那么就需要自己计算字��
�串的偏移,因为你的数据段寄存器 DS
中没有内容。

2. 
它后面会有作用的。有时候人那,写代码很容易有失误,比��
�你以为我没有用 push, pop,那么
堆栈段就没有用,就不需要了,可是一旦后面用到 call, 
ret,问题就出来了,所以预先准备一个
也没什么大碍。

Original comment by solrex on 26 Sep 2008 at 12:30

GoogleCodeExporter commented 9 years ago
另外,在 report issue 时候请使用有意义的标题,title 就是 
title,不是 name。

title: An identifying name given to a book, play, film, musical 
composition, or other work.

无论是读邮件还是看论坛,读者都会希望从标题能够看出来��
�大致的内容。

Original comment by solrex on 26 Sep 2008 at 12:37