Du hast vergessen, dass du in der GDT rumfummelst, und die Basisadressen änderst. Das bedeutet, wenn du auf die lineare Adresse 0xe0000000 (da wo halt der Linear Frame Buffer ist) zugreifen willst, musst du entweder einen Selektor mit Basis 0 nehmen, oder die andere Basis berücksichtigen.
Wenn du in deiner Display_Pixel funktion das Schreiben in den Frame Buffer so machst (Selektor mit Basis 0 laden), klappt es:
push cx
mov cx, 0x08 ; eigentlich linear_sel
mov ds, cx
mov [edi-3],ax
mov [edi-1],dl
mov cx, 0x18 ; eigentlich sys_data
mov ds, cx
pop cx
Optimieren darfste das selbst.