2013-11-24 4 views
1

일부 어셈블리 함수와 16 비트 C 컴파일러를 사용하여 운영 체제를 만드는 방법에 대한 작업을하고 있습니다. 내 임무는 0x10 인터럽트를 사용하여 화면에 문자열을 인쇄하는 것이다. 인터럽트는 어셈블리 파일에서 호출 할 수 있으므로 인터럽트 번호와 AX, BX, CXDX에 전달 된 인터럽트 매개 변수를 사용하는 interrupt라는 함수가 포함 된 어셈블리 파일이 제공되었습니다. 예를 들어, 제공 기능 'Q'를 인쇄 할 , I는 다음과 같이 작성해야합니다 :BIOS 인터럽트를 사용하여 문자열을 인쇄하는 방법

char al = 'Q' 
char ah = 0xE 
int ax = ah*256+al; 
interrupt(0x10,ax,0,0,0); 

OR, 단순히 :라는 C 프로그램

interrupt(0x10,0xE*256+'Q',0,0,0); 

kernel.c

나의 임무는 printString(char *chars)C에 쓰는 것이다.이 문자열은 문자열을 취해 논의 된 어셈블리 기능을 사용하여 화면에 출력한다. 내가이 방법을 수행 한

:

void printString(char * chars){ 
int i = 0; 
int l = length(chars); 
for(; i < l; i++){ 
    interrupt(0x10,0xE*256+chars[i],0,0,0); 
} 
} 

하지만 대신 한 번에 인쇄의 문자열을 여러 번 인쇄합니다. "Hello World"를 인쇄하려고하면 다른 문자와 마찬가지로 11 개의 문자가 포함되어 있기 때문에 11 번 인쇄됩니다.

+4

인터럽트를 처리하는 코드에 문제가있는 것 같습니다. 그것을 추가 할 수 있습니까? –

+0

'length()'대신'strlen()'되지 않을까요? 이 코드가 실제로 컴파일됩니까? 아니면'length()'문자열의 길이를 얻는 커스텀 함수인가? 이 경우 추가 할 수 있습니까? –

+0

이것은 시작하기에 적절한 운동이지만 BIOS를 사용하는 것은 OS를 작성하는 방법이 아닙니다. 화면에 물건을 쓰는 적절한 방법은 비디오 인터페이스 용 드라이버를 작성하는 것입니다. –

답변

0

난 당신이 null 문자 읽기를 종료해야 할 것 같아요. 나는 어셈블리 파일이 문자 버퍼를 가지고 이상한 일을하는 것을 보았다. main()에서 인터럽트 함수를 직접 호출했을 때도 여러 문자가 인쇄되었습니다.

줄 추가 : while (1); main()이 반환되지 않게합니다. main()의 여러 인스턴스를 실행하는 부트 로더가 반복되는 결과를 초래합니다.

관련 문제