NASM에서 C언어 함수사용 방법
글쓴이: wisdomtuya / 작성시간: 목, 2007/12/20 - 10:42오후
OS를 공부하고 있는 학생입니다.
다름이 아니라 NASM과 GCC를 이용하는데 문제가있어 질문 올립니다.
BootSect에서 C언어로 Jump하여 전역의 string을 출력하는 프로그램입니다.
NASM : BootSector
GCC : Entry 함수
NASM : 출력함수
bootsect.asm
... mov ax, 0x1000 ; 지역변수를 사용하기 위해서 mov ss, ax ; 스택을 초기화 mov ax, 0xfff0 mov sp, ax mov ax, 0x2000 mov ds, ax ;전역 변수를 사용하기 위해서 ds 초기화 jmp 0x2000:0x0000 ; 0x20000 번지의 C언어 코드로 점프
kernel.c
char string = "Hello world"; void start_kernel() { int i = 0; for ( i = 0 ; i < 11 ; i++ ) { print(string[i]); // int 10h를 이용한 출력함수입니다. } }
print.asm
[global _print] _print: push bp mov bp, sp pusha mov al, byte [bp+4] mov ah, 0eh mov bx, 06h int 10h popa mov sp, bp pop bp ret
컴파일 및 링크
nasm -f bin -o bootsect.bin bootsect.asm nasm -f coff -o print.o print.asm gcc -c kernel.c ld -o kernel -Ttext 0x20000 -e _start_kernel kernel.o print.o objcopy -R .note -R .comment -S -O binary kernel kernel.bin copy bootsect.bin+kernel.bin /b kernel.img
테스트 VMware 6.0.0
print('C') << 이런 식으로 한문자씩 찍으면 잘 찍히는데요
전역 변수를 사용하여 위 코드를 실행하면 "Hello world"에서
'H' 하나만 찍힙니다.
C언어를 올바로 사용하기 위한(전역 변수와 지역변수 올바른 사용) 기본 셋팅에 대해서
제가 뭔가를 놓치고 있는 것 같습니다.
바쁘신줄 알지만 조심스레 조언을 구해 봅니다.
Forums:
댓글 달기