[커널] visual 2008에서 부트로더에서 c언어로 점프시 에러..
현재 c로 점프를 할려고 하는데요
컴파일 프로그램으로는 visual 2008을 사용하고있습니다.
현재 visual2008의 옵션은 빌드전 이벤트에서
ml /c /Fl /coff Sload.asm 을 하고있습니다.
근데 여기서 에러가
1>빌드 전 이벤트를 수행하고 있습니다...
1> Assembling: Sload.asm
1>Sload.asm(81) : error A2155:cannot use 16-bit register with a 32-bit address
1>Sload.asm(12) : error A2022:instruction operands must be the same size
1>Sload.asm(22) : error A2004:symbol type conflict
1>Sload.asm(42) : error A2006:undefined symbol : _GDT
1>Sload.asm(53) : error A2071:initializer magnitude too large for specified size
1>Sload.asm(71) : error A2004:symbol type conflict
이렇게 나옵니다.. 현재 원인을 모르겟습니다..
어떤것 때문일까요..
링커에서 출력파일에서 ssmos.bin 으로 출력파일을 생성하게했습니다.
나머지옵션은 아래와 같습니다..
C/C++ > 일반 :
- 디버깅 정보 형식 : 사용 안함
- 64bit 이식성 문제점 검색 : 아니오
C/C++ > 최적화 :
- 최적화 : 사용 안함
- 전체 프로그램 최적화 : 아니오
C/C++ > 전처리기
- 전처리기 정의 : _DEBUG-
표준 포함 경로 무시 : 예
C/C++ > 코드 생성
- 문자열 풀링 사용 : 예
- 최소 다시 빌드 가능 : 아니오
- 구조체 멤버 맞춤 : 1byte
- 버퍼 보안 검사 : 아니오
- 함수 수준 링크 사용 : 예
C/C++ > 미리 컴파일된 헤더
- 미리 컴파일된 헤더 만들기 / 사용 : 미리 컴파일된 헤더 사용 안함
C/C++ > 출력 파일
- 어셈블러 출력 : 어셈블리, 기계어 코드, 소스(/FAcs)
C/C++ > 고급
- 모든 전처리기 정의 해제 : 예
링커 > 입력
- 모든 기본 라이브러리 무시 : 예
링커 > 디버깅
- 디버그 정보 생성 : 아니오
- 맵 파일 생성 : 예
- 맵 파일 이름 : SSMos.map
링커 > 시스템
링커 > 고급
- 진입점 : EntryPoint16
- 기준 주소 : 7e00
저의 소스 파일입니다.. sload.asm
.386p
.MODEL FLAT
public _EntryPoint16
extern _SSMOS_MAIN:NEAR
.CODE
_EntryPoint16 PROC NEAR
mov ax, 07E0h
push word ptr ax
mov ax, offset init
push word ptr ax
retf
init:
; Set DS and ES to the data segment.
MOV AX, CS
MOV DS, AX
MOV ES, AX
MOV SS, AX
mov dx, 3F2h ;플로피디스크를 끈다.
xor al, al
out dx, al
;push OFFSET msg_loader ; kernel_loading
;call MSGOUT
;add sp, 2
CLI mov al, 0FFh
out 0A1h, al
db 3eh ; LGDT 명령어 기계어
db 67h
db 0fh
db 01h
db 15h
dd GDT-7E00h
mov eax, cr0 ; protected Mode 진입
or al, 1
mov cr0, eax
jmp $+2
nop
nop
db 66h ;
db 0eah
dw _EntryPoint32
db 08h
finish:
HLT ;
jmp finish
_EntryPoint16 ENDP
_EntryPoint32 PROC NEAR
mov ax, 10h ; ds segment descriptor
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp, 1ffffh
call _SSMOS_MAIN
finish:
hlt
jmp finish
_EntryPoint32 ENDP
MSGOUT PROC NEAR
push bp
mov bp, sp
pusha
mov si, WORD ptr [bp+4]
print:
lodsb
or al, al
jz finish
mov ah, 0eh ; teletype output function
mov bx, 08h ; back/fore ground color
int 10h
jmp print
finish:
popa
pop bp
ret
MSGOUT ENDP
.DATA
;===============================================================================
; GDT table descriptor
;===============================================================================
GDT_DESCR STRUCT
GDTRDESC dw GDT_SIZE -1
dd GDT
GDT_DESCR ENDS
;===============================================================================
; GDT table
;===============================================================================
;----------------------------------
; GDT TABLE INDEX #0
; INDEX : NULL SELECTOR
;----------------------------------
GDT dd 0
dd 0
;----------------------------------
; GDT TABLE INDEX #1
; INDEX : 0x0008h
; TYPE : CODE SEGMENT
; RING LEVEL : 0
; ATTRIBUTES : Excute/Read, Nonconforming, 4GB
;----------------------------------
dw 0ffffh ; segment limit 15:00
dw 0000h ; base address 15:00
db 00h ; base address 23:16
db 10011010b ; P | DPL | S | TYPE
db 11001111b ; G | D/B | 0 | AVL | segment limit 19:16
db 00h ; base address 31:24
;----------------------------------
; GDT TABLE INDEX #2
; INDEX : 0x0010h
; TYPE : DATA SEGMENT
; RING LEVEL : 0
; ATTRIBUTES : Read/Write, 4GB
;----------------------------------
dw 0ffffh
dw 0000h
db 00h
db 10010010b
db 11001111b
db 00h
GDT_SIZE EQU $-GDT
msg_loader db "kernel loading...", 0h
END
KLDP의 커널관련 해서 하시는분들은 어떻게해서 VISUAL 2008에서 C로 점프를 시켯나요..ㅠㅠ
댓글 달기