title: getting warning "assignment makes integer from pointer without a cast"
body: <p>I get this warning on line 59:</p>
  
  <blockquote>
    <p>assignment makes integer from pointer without a cast.</p>
  </blockquote>
  
  <p>How can I fix it? Here is the whole file (copied from <a href="http://pastebin.com/BrmjBAS0" rel="nofollow">http://pastebin.com/BrmjBAS0</a>):</p>
  
  <pre><code>/* bkerndev - Bran's Kernel Development Tutorial
  *  By:   Brandon F. (friesenb@gmail.com)
  *  Desc: Global Descriptor Table management
  *
  *  Notes: No warranty expressed or implied. Use at own risk. */
  
  
  /* Defines a GDT entry */
  struct gdt_entry
  {
      unsigned short limit_low;
      unsigned short base_low;
      unsigned char base_middle;
      unsigned char access;
      unsigned char granularity;
      unsigned char base_high;
  } __attribute__((packed));
  
  struct gdt_ptr
  {
      unsigned short limit;
      unsigned int base;
  } __attribute__((packed));
  
  /* Our GDT, with 3 entries, and finally our special GDT pointer */
  struct gdt_entry gdt[3];
  struct gdt_ptr gp;
  
  /* This is in start.asm. We use this to properly reload
  *  the new segment registers */
  extern void _gdt_flush();
  
  /* 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)
  {
      /* Setup the descriptor base address */
      gdt[num].base_low = (base &amp; 0xFFFF);
      gdt[num].base_middle = (base &gt;&gt; 16) &amp; 0xFF;
      gdt[num].base_high = (base &gt;&gt; 24) &amp; 0xFF;
  
      /* Setup the descriptor limits */
      gdt[num].limit_low = (limit &amp; 0xFFFF);
      gdt[num].granularity = ((limit &gt;&gt; 16) &amp; 0x0F);
  
      /* Finally, set up the granularity and access flags */
      gdt[num].granularity |= (gran &amp; 0xF0);
      gdt[num].access = access;
  }
  
  /* Should be called by main. This will setup the special GDT
  *  pointer, set up the first 3 entries in our GDT, and then
  *  finally call gdt_flush() in our assembler file in order
  *  to tell the processor where the new GDT is and update the
  *  new segment registers */
  void gdt_install()
  {
      /* Setup the GDT pointer and limit */
      gp.limit = (sizeof(struct gdt_entry) * 3) - 1;
      gp.base = &amp;gdt;
  
      /* Our NULL descriptor */
      gdt_set_gate(0, 0, 0, 0, 0);
  
      /* The second entry is our Code Segment. The base address
      *  is 0, the limit is 4GBytes, it uses 4KByte granularity,
      *  uses 32-bit opcodes, and is a Code Segment descriptor.
      *  Please check the table above in the tutorial in order
      *  to see exactly what each value means */
      gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF);
  
      /* 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);
  
      /* Flush out the old GDT and install the new changes! */
      _gdt_flush();
  }
  </code></pre>