OS 커널의 구조와 원리에서 문자열이 깨져요...
글쓴이: kimmch696 / 작성시간: 월, 2009/11/02 - 11:35오전
코드 내용은 아래와 같고 kernel 이라는 문자열을 출력하는 것입니다 근데 문자열은 출력이 안되고 배경은 찍히는데 않되네요... 컴파일러 버전을 바꿔 보라고해서 바꿔도 봤는데 안되고... 소스에 문제는 없어 보이는거 같은데 아시는 분 해결책 좀 알려주세요...ㅠ
[org 0] ;컴파일러에 실행을 위한 주소를 알려주고 offset을 계산할 때 지정된 값만큼 더해준다. [bits 16] ;16bit로 이루어진 code이다. start: mov ax, cs ;CS에서는 0x1000이 들어 있다. mov ds, ax ; xor ax, ax mov ss, ax lea esi, [msgKernel] ;문자열이 있는 곳의 주소를 구함 mov ax, 0xB800 ; mov es, ax ;es에 0xB800을 넣는다. mov edi, 0 ;화면의 제일 처음 부분부터 시작할 것이다. call printf ; jmp $ ;현재 주소를 나타내므로 무한 loop에 빠진다 printf: push eax ;먼저 있던 eax 값을 스택에 보존해 놓는다. printf_loop: mov al, byte [esi] ;esi가 가리키는 주소에서 문자를 하나 가져온다. or al, al ;문자를 화면에 나타낸다. jz printf_end ;0이라면 print_end로 점프한다. inc edi ;0이 아니라면 edi를 1증가시켜 mov byte [es:edi], 0x06 ;문자색과 배경색의 값을 넣는다. inc esi ;다음 문자를 꺼내기 위해 esi를 ㅎㅏ나 증가시킨다. jmp printf_loop ;루프를 돈다. printf_end: pop eax ;스택에 보존했던 eax를 다시 꺼낸다. ret ;호출한 부분으로 돌아간다. msgKernel db"kernel", 0
Forums:
video buffer에 쓰는 부분에 하나가 빠진 것 같습니다만...
소스 코드를 보면 0xb800:0001 부터 0x06만 줄기차게 입력하는 코드가 되는군요.
2 byte 단위로 색과 문자를 쓰도록 되어 있는 곳이니 0x06의 색상으로 아스키
코드 0x06만 문자열 길이의 반 정도 출력되겠지요.
소스에 빠진 한 줄을 찾아서 채워 넣어보시기 바랍니다.
댓글 달기