汇编代码的解释

时间:2010-10-27 16:41:21

标签: syntax assembly x86

有人能解释一下这段汇编代码吗?

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的参数?如果可能,请详细解释。提前致谢。

3 个答案:

答案 0 :(得分:7)

它实际上是全局描述符表中的一个8字节条目。它创建了一个描述符,将整个4G地址空间作为选择器。

equ $-gdt在汇编程序中设置一个值,该值等于此位置($)和gdt标签之间的差异。换句话说,它是GDT本身内该条目的偏移量。

GDT条目的结构如下:

alt text

下面解释各个部分。

alt text

针对您的具体价值观:

(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
  1. 基地址是根据fcb字段计算得出的,从最高有效到最低 - 因为这些都是零,基数为零。

  2. 选择器限制是根据e的最右边4位和a的全部计算得出的,在这种情况下给出0xfffff。这已添加1,以提供0x100000。请参阅下面的第3点,了解这意味着什么。

  3. e(标志)的前4位设置粒度(4K而不是1字节)和操作数大小(32位)。它的粒度为4K(12位),页面数为0x100000(20位),可为您提供完整的32位(4G)地址空间。

  4. 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位)。