TSS problem
Posted: Sat Aug 03, 2002 7:23 pm
Okay, this is driving me nuts. Several of John Fine's code does this with no problem, but I always get an error from NASM saying that "shift operater can only be used on scalar values". A snippet of my code is posted below.
[tt]
[SECTION .data]
[global _tss0_begin]
_tss0_begin: ;empty, this is just so that we can "get the ball rolling"
dw 0 ; back link
dd 0 ; esp0
dw 0 ; ss0
dd 0 ; esp1
dw 0 ; ss1
dd 0 ; esp2
dw 0 ; ss2
dd 0 ; cr3
dd 0 ; eip
dd 0 ; eflags
dd 0 ; eax
dd 0 ; ecx
dd 0 ; edx
dd 0 ; ebx
dd 0 ; esp
dd 0 ; ebp
dd 0 ; esi
dd 0 ; edi
dw 0 ; es
dw 0 ; cs
dw 0 ; ss
dw 0 ; ds
dw 0 ; fs
dw 0 ; gs
dw 0 ; ldt
dw 0 ; trace/trap
dw 0 ; i/o bitmap address
[global _tss1_begin]
_tss1_begin:
dw 0 ; back link
dd 0 ; esp0
dw 0 ; ss0
dd 0 ; esp1
dw 0 ; ss1
dd 0 ; esp2
dw 0 ; ss2
dd 0x9C000 ; cr3
dd _task_1 ; eip
dd 0 ; eflags
dd 0 ; eax
dd 0 ; ecx
dd 0 ; edx
dd 0 ; ebx
dd stack ; esp
dd 0 ; ebp
dd 0 ; esi
dd 0 ; edi
dw 0 ; es
dw LINEAR_CODE_SEL ; cs
dw LINEAR_DATA_SEL ; ss
dw 0 ; ds
dw 0 ; fs
dw 0 ; gs
dw 0 ; ldt
dw 0 ; trace/trap
dw 0 ; i/o bitmap address
[global _tss2_begin]
_tss2_begin:
dw 0 ; back link
dd 0 ; esp0
dw 0 ; ss0
dd 0 ; esp1
dw 0 ; ss1
dd 0 ; esp2
dw 0 ; ss2
dd 0x9C000 ; cr3
dd _task_2 ; eip
dd 0 ; eflags
dd 0 ; eax
dd 0 ; ecx
dd 0 ; edx
dd 0 ; ebx
dd stack ; esp
dd 0 ; ebp
dd 0 ; esi
dd 0 ; edi
dw 0 ; es
dw LINEAR_CODE_SEL ; cs
dw LINEAR_DATA_SEL ; ss
dw 0 ; ds
dw 0 ; fs
dw 0 ; gs
dw 0 ; ldt
dw 0 ; trace/trap
dw 0 ; i/o bitmap address
tss2_end:
TSS_SIZE equ (tss2_end - _tss2_begin)
gdt: ;our descriptors
; NULL descriptor
dw 0 ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0 ; type
db 0 ; limit 19:16, flags
db 0 ; base 31:24
; unused descriptor
dw 0
dw 0
db 0
db 0
db 0
db 0
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
LINEAR_CODE_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 9Ah ; present,ring 0,code,non-conforming,readable
db 0CFh ; page-granular (4 gig limit), 32-bit
db 0
TSS_ENTRY_0 equ $-gdt
desc _tss0_begin, TSS_SIZE, D_TSS
TSS_ENTRY_1 equ $-gdt
desc _tss1_begin, TSS_SIZE, D_TSS
TSS_ENTRY_2 equ $-gdt
desc _tss2_begin, TSS_SIZE, D_TSS
gdt_end:
gdt_ptr:
dw gdt_end - gdt - 1
dd gdt
[/tt]
For some reason, NASM doesn't seem to understand that in:
desc _tss2_begin, TSS_SIZE, D_TSS
_tss2_begin should be an address, and it gives the error mentioned above.
Thanks in advance,
K.J.
[tt]
[SECTION .data]
[global _tss0_begin]
_tss0_begin: ;empty, this is just so that we can "get the ball rolling"
dw 0 ; back link
dd 0 ; esp0
dw 0 ; ss0
dd 0 ; esp1
dw 0 ; ss1
dd 0 ; esp2
dw 0 ; ss2
dd 0 ; cr3
dd 0 ; eip
dd 0 ; eflags
dd 0 ; eax
dd 0 ; ecx
dd 0 ; edx
dd 0 ; ebx
dd 0 ; esp
dd 0 ; ebp
dd 0 ; esi
dd 0 ; edi
dw 0 ; es
dw 0 ; cs
dw 0 ; ss
dw 0 ; ds
dw 0 ; fs
dw 0 ; gs
dw 0 ; ldt
dw 0 ; trace/trap
dw 0 ; i/o bitmap address
[global _tss1_begin]
_tss1_begin:
dw 0 ; back link
dd 0 ; esp0
dw 0 ; ss0
dd 0 ; esp1
dw 0 ; ss1
dd 0 ; esp2
dw 0 ; ss2
dd 0x9C000 ; cr3
dd _task_1 ; eip
dd 0 ; eflags
dd 0 ; eax
dd 0 ; ecx
dd 0 ; edx
dd 0 ; ebx
dd stack ; esp
dd 0 ; ebp
dd 0 ; esi
dd 0 ; edi
dw 0 ; es
dw LINEAR_CODE_SEL ; cs
dw LINEAR_DATA_SEL ; ss
dw 0 ; ds
dw 0 ; fs
dw 0 ; gs
dw 0 ; ldt
dw 0 ; trace/trap
dw 0 ; i/o bitmap address
[global _tss2_begin]
_tss2_begin:
dw 0 ; back link
dd 0 ; esp0
dw 0 ; ss0
dd 0 ; esp1
dw 0 ; ss1
dd 0 ; esp2
dw 0 ; ss2
dd 0x9C000 ; cr3
dd _task_2 ; eip
dd 0 ; eflags
dd 0 ; eax
dd 0 ; ecx
dd 0 ; edx
dd 0 ; ebx
dd stack ; esp
dd 0 ; ebp
dd 0 ; esi
dd 0 ; edi
dw 0 ; es
dw LINEAR_CODE_SEL ; cs
dw LINEAR_DATA_SEL ; ss
dw 0 ; ds
dw 0 ; fs
dw 0 ; gs
dw 0 ; ldt
dw 0 ; trace/trap
dw 0 ; i/o bitmap address
tss2_end:
TSS_SIZE equ (tss2_end - _tss2_begin)
gdt: ;our descriptors
; NULL descriptor
dw 0 ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0 ; type
db 0 ; limit 19:16, flags
db 0 ; base 31:24
; unused descriptor
dw 0
dw 0
db 0
db 0
db 0
db 0
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
LINEAR_CODE_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 9Ah ; present,ring 0,code,non-conforming,readable
db 0CFh ; page-granular (4 gig limit), 32-bit
db 0
TSS_ENTRY_0 equ $-gdt
desc _tss0_begin, TSS_SIZE, D_TSS
TSS_ENTRY_1 equ $-gdt
desc _tss1_begin, TSS_SIZE, D_TSS
TSS_ENTRY_2 equ $-gdt
desc _tss2_begin, TSS_SIZE, D_TSS
gdt_end:
gdt_ptr:
dw gdt_end - gdt - 1
dd gdt
[/tt]
For some reason, NASM doesn't seem to understand that in:
desc _tss2_begin, TSS_SIZE, D_TSS
_tss2_begin should be an address, and it gives the error mentioned above.
Thanks in advance,
K.J.