일부 어셈블리 함수와 16 비트 C 컴파일러를 사용하여 운영 체제를 만드는 방법에 대한 작업을하고 있습니다. 내 임무는 0x10 인터럽트를 사용하여 화면에 문자열을 인쇄하는 것이다. 인터럽트는 어셈블리 파일에서 호출 할 수 있으므로 인터럽트 번호와 AX
, BX
, CX
및 DX
에 전달 된 인터럽트 매개 변수를 사용하는 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 번 인쇄됩니다.
인터럽트를 처리하는 코드에 문제가있는 것 같습니다. 그것을 추가 할 수 있습니까? –
'length()'대신'strlen()'되지 않을까요? 이 코드가 실제로 컴파일됩니까? 아니면'length()'문자열의 길이를 얻는 커스텀 함수인가? 이 경우 추가 할 수 있습니까? –
이것은 시작하기에 적절한 운동이지만 BIOS를 사용하는 것은 OS를 작성하는 방법이 아닙니다. 화면에 물건을 쓰는 적절한 방법은 비디오 인터페이스 용 드라이버를 작성하는 것입니다. –