有人能解释一下这段汇编代码吗?
LINEAR_DATA_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 92h ; present, ring 0, data, expand-up, writable
db 0CFh ; page-granular (4 gig limit), 32-bit
db 0
这里我已经搜索过命令equ,dw和db但我无法理解这段代码实际上做了什么(尤其是第一行)。什么是$ -gdt以及dw和db的参数?如果可能,请详细解释。提前致谢。
答案 0 :(得分:7)
它实际上是全局描述符表中的一个8字节条目。它创建了一个描述符,将整个4G地址空间作为选择器。
equ $-gdt
在汇编程序中设置一个值,该值等于此位置($
)和gdt
标签之间的差异。换句话说,它是GDT本身内该条目的偏移量。
GDT条目的结构如下:
下面解释各个部分。
针对您的具体价值观:
(a) dw FFFFh
(b) dw 0
(c) db 0
(d) db 92h ; present, ring 0, data, expand-up, writable
(e) db CFh ; page-granular (4 gig limit), 32-bit
(f) db 0
基地址是根据f
,c
和b
字段计算得出的,从最高有效到最低 - 因为这些都是零,基数为零。
选择器限制是根据e
的最右边4位和a
的全部计算得出的,在这种情况下给出0xfffff
。这已添加1,以提供0x100000
。请参阅下面的第3点,了解这意味着什么。
e
(标志)的前4位设置粒度(4K而不是1字节)和操作数大小(32位)。它的粒度为4K(12位),页面数为0x100000
(20位),可为您提供完整的32位(4G)地址空间。
d
字段是访问字节,并根据0x92
设置以下属性:
Pr
出现(内存中)位为真。Privl
privelege level为0(需要响铃0才能访问)。Ex
可执行位0(数据选择器)。DC
,方向位为0,段长大。RW
为1,内存可写。Ac
访问位设置为0。答案 1 :(得分:3)
db/dw
表示数据字/数据字节。这是一些数据,没有上下文可能意味着什么,这就是为什么有一些评论。 equ
表示相等,它用于存储常量。我猜gdt
在其他地方被定义为/ Global Descriptor Table指针的地址。
这里有一个GDT tutorial,它使用相同的常量进行函数调用:
/* Setup a descriptor in the Global Descriptor Table */
void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran)
[...]
/* The third entry is our Data Segment. It's EXACTLY the
* same as our code segment, but the descriptor type in
* this entry's access byte says it's a Data Segment */
gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF);
答案 2 :(得分:2)
http://en.wikibooks.org/wiki/X86_Assembly/Global_Descriptor_Table#GDT
dw和db分别是'定义字'和'定义字节',但在c风格意义上不是'定义'。它们在内存中分配大小字和字节的空间(字取决于体系结构,字节是8位)。