Please help me! I made a simple code that shows a sentence (which is stored in memory) on the screen in protected mode 32-bit. It runs at boot (0000:7c00). It worked in bochs. But then i did a kernel equivalent, but it did not work. IDT loaded, but it did not work. I do not think the reasons for this error. The code:    
include "..\includes\structures.inc"
use16
org 0x0000
 
start:
cli
 
push cs
pop  ds
call a20.check
cmp        ax, 1
je     a20_already_enabled
call a20.enable
a20_already_enabled:
lgdt [gdt_desc]
lidt [idt_desc]
 
mov eax, cr0
or eax, 1
mov cr0, eax
 
jmp 0x08:pmode
a20:
; a20.check
; AX = A20 gate status
.check:
       pushf
       push    ds
  push    es
  push    di
  push    si
      cli
     xor     ax, ax
      mov     es, ax
  not     ax
  mov     ds, ax
  mov     di, 0x0500
  mov     si, 0x0510
      mov     al, byte[es:di]
 push    ax
      mov     al, byte[ds:si]
 push    ax
      mov     byte[es:di], 0x00
       mov     byte[ds:si], 0xFF
   cmp     byte[es:di], 0xFF
   pop     ax
  mov     byte[ds:si], al
     pop     ax
  mov     byte[es:di], al
     mov     ax, 0
       je      .check_a20_exit
 mov     ax, 1
.check_a20_exit:
   pop     si
  pop     di
  pop     es
  pop     ds
  popf
    ret
.enable:
     cli
     call    .a20wait
    mov     al, 0xAD
    out     0x64, al
        call    .a20wait
    mov     al, 0xD0
    out     0x64, al
        call    .a20wait2
   in      al, 0x60
    push    eax
     call    .a20wait
    mov     al, 0xD1
    out     0x64, al
        call    .a20wait
    pop     eax
 or      al, 2
       out     0x60, al
        call    .a20wait
    mov     al, 0xAE
    out     0x64, al
        call    .a20wait
    ret
.a20wait:
    in      al, 0x64
    test    al, 2
       jnz     .a20wait
    ret
.a20wait2:
   in      al, 0x64
    test    al, 1
       jz      .a20wait
    ret
use32
pmode:
org $ + 0x20000
 
mov ax, 0x10
mov ds, ax
mov es, ax
mov ss, ax
mov esp, 0x090000
sti
 
call ClrScr32
mov esi, string
mov edi, 0x0B8000
mov ecx, 52
rep movsb
 
hlt
 
ClrScr32:
 pushad
 
 cld
 mov edi, 0xB8000
 mov cx, 80 * 25
 mov ah, 0x0F
 mov al, ' '
 rep stosw
 
 popad
 ret
string db 'H'
       db 0x0F
       db 'E'
       db 0x0F
       db 'L'
       db 0x0F
       db 'L'
       db 0x0F
       db 'O'
       db 0x0F
       db ' '
       db 0x0F
       db 'F'
       db 0x0F
       db 'R'
       db 0x0F
       db 'O'
       db 0x0F
       db 'M'
       db 0x0F
       db ' '
       db 0x0F
       db 'P'
       db 0x0F
       db 'R'
       db 0x0F
       db 'O'
       db 0x0F
       db 'T'
       db 0x0F
       db 'E'
       db 0x0F
       db 'C'
       db 0x0F
       db 'T'
       db 0x0F
       db 'E'
       db 0x0F
       db 'D'
       db 0x0F
       db ' '
       db 0x0F
       db 'M'
       db 0x0F
       db 'O'
       db 0x0F
       db 'D'
       db 0x0F
       db 'E'
       db 0x0F
       db '!'
       db 0x0F
Divide_by_zero_Error:
    mov     eax, 0              ; Division result: 0
        iret
Debug:
      iret
Non_maskable_Interrupt:
     iret
Breakpoint:
 iret
Overflow:
   iret
Bound_Range_Exceeded:
       iret
Invalid_Opcode:
 iret
Device_Not_Available:
       iret
Double_Fault:
       mov word[0xB87B6], "DF"
   iret
Coprocessor_Segment_Overrun:
        iret
Invalid_TSS:
        mov word[0xB87B6], "TS"
   iret
Segment_Not_Present:
        mov word[0xB87B6], "NP"
   iret
Stack_Segment_Fault:
        mov word[0xB87B6], "SS"
   iret
General_Protection_Fault:
   mov word[0xB87B6], "GP"
   iret
Page_Fault:
 mov word[0xB87B6], "PF"
   iret
x87_Floating_Point_Exception:
       iret
Alignment_Check:
    mov word[0xB87B6], "AC"
   iret
Machine_Check:
      iret
SIMD_Floating_Point_Exception:
      iret
Security_Exception:
 iret
Reserved:
   iret
idt:
; INT 0x00 - Divide-by-zero Error
INT_00 idt_entry Divide_by_zero_Error, 8, 10001110b
; INT 0x01 - Debug
INT_01 idt_entry Debug, 8, 10001110b
; INT 0x02 - Non-maskable Interrupt
INT_02 idt_entry Non_maskable_Interrupt, 8, 10001110b
; INT 0x03 - Breakpoint
INT_03 idt_entry Breakpoint, 8, 10001110b
; INT 0x04 - Overflow
INT_04 idt_entry Overflow, 8, 10001110b
; INT 0x05 - Bound Range Exceeded
INT_05 idt_entry Bound_Range_Exceeded, 8, 10001110b
; INT 0x06 - Invalid Opcode
INT_06 idt_entry Invalid_Opcode, 8, 10001110b
; INT 0x07 - Device Not Available
INT_07 idt_entry Device_Not_Available, 8, 10001110b
; INT 0x08 - Double Fault
INT_08 idt_entry Double_Fault, 8, 10001110b
; INT 0x09 - Coprocessor Segment Overrun
INT_09 idt_entry Coprocessor_Segment_Overrun, 8, 10001110b
; INT 0x0A - Invalid TSS
INT_0A idt_entry Invalid_TSS, 8, 10001110b
; INT 0x0B - Segment Not Present
INT_0B idt_entry Segment_Not_Present, 8, 10001110b
; INT 0x0C - Stack-Segment Fault
INT_0C idt_entry Stack_Segment_Fault, 8, 10001110b
; INT 0x0D - General Protection Fault
INT_0D idt_entry General_Protection_Fault, 8, 10001110b
; INT 0x0E - Page Fault
INT_0E idt_entry Page_Fault, 8, 10001110b
; INT 0x0F - Reserved
INT_0F idt_entry Reserved, 8, 11100110b
; INT 0x10 - x87 Floating-Point Exception
INT_10 idt_entry x87_Floating_Point_Exception, 8, 10001110b
; INT 0x11 - Alignment Check
INT_11 idt_entry Alignment_Check, 8, 10001110b
; INT 0x12 - Machine Check
INT_12 idt_entry Machine_Check, 8, 10001110b
; INT 0x13 - SIMD Floating-Point Exception
INT_13 idt_entry SIMD_Floating_Point_Exception, 8, 10001110b
; INT 0x14 - Reserved
INT_14 idt_entry Reserved, 8, 10001110b
; INT 0x15 - Reserved
INT_15 idt_entry Reserved, 8, 10001110b
; INT 0x16 - Reserved
INT_16 idt_entry Reserved, 8, 10001110b
; INT 0x17 - Reserved
INT_17 idt_entry Reserved, 8, 10001110b
; INT 0x18 - Reserved
INT_18 idt_entry Reserved, 8, 10001110b
; INT 0x19 - Reserved
INT_19 idt_entry Reserved, 8, 10001110b
; INT 0x1A - Reserved
INT_1A idt_entry Reserved, 8, 10001110b
; INT 0x1B - Reserved
INT_1B idt_entry Reserved, 8, 10001110b
; INT 0x1C - Reserved
INT_1C idt_entry Reserved, 8, 10001110b
; INT 0x1D - Reserved
INT_1D idt_entry Reserved, 8, 10001110b
; INT 0x1E - Security Exception
INT_1E idt_entry Security_Exception, 8, 10001110b
; INT 0x1F - Reserved
INT_1F idt_entry Reserved, 8, 10001110b
idt_end:
idt_desc:
 dw idt_end - idt - 1
 dd idt
gdt:
 
gdt_null:
 dd 0
 dd 0
 
gdt_code:
 dw 0FFFFH
 dw 0
 db 0
 db 10011010B
 db 11011111B
 db 0
 
gdt_data:
 dw 0FFFFH
 dw 0
 db 0
 db 10010010B
 db 11011111B
 db 0
 
gdt_end:
 
gdt_desc:
 dw gdt_end - gdt - 1
 dd gdt