2012-10-10 2 views

답변

1

제가 초기 학부 학생들의 기억에서 부분적으로 도울 수 있습니다. DOS에서

어드레스 0xB8000000 (0xB800 : 세그먼트로서 0 바르게 코멘트 지적 오프셋) 텍스트 모드 비디오 메모리 ( 0xA8000000 그래픽 해당되는)의 시작 어드레스이다. 이 영역에 쓰여진 것은 vga 카드에 직접 복사됩니다. 이제 화면의 모든 문자는 2 바이트로 구성됩니다. 첫 번째 바이트는 ascii 문자이고 두 번째 바이트는 색상입니다.

그래서 효과적으로은 (정상 근처 포인터가하지 않을 것이기 때문에) 16 비트 C에서 멀리 포인터를 가지고 그것을 위의 주소를 할당합니다. 그런 다음 화면 크기 (25 * 80) 또는 무엇이든 * 2를 가정하면 화면을 채우는 총 바이트 수는 1 바이트입니다.

위의 내용을 사용하여 간단한 printf 함수를 작성한 것을 기억합니다.

문제로 다시 얻기, 당신은 화면 크기까지 주소 위에서 시작하는 모든 심지어 주소를 통해 루프 코드를 작성해야합니다. 홀수 하나는 색상을 나타 내기 때문에 짝수 주소. 거기서 할당 된 문자가 유효한 ascii인지 확인하고 필요에 따라 더하거나 뺍니다. 'A'+ 32는 당신을 '등'으로 만들 것입니다.

질문은 위의 프로그램을시기에 대한 이 작업을 수행 남아있다. 나는 당신이 어떤 화면 문자가 바뀔 때마다 트리거하는 dos.h에서 인터럽트 나 비슷한 것을 가질 수 있다고 생각한다. 그러나이 부분은 내 기억에 분명하지 않습니다.

그게 효과가 있는지보십시오.

+0

'0xB8000000'은 너무 많아서 잘못되었거나 혼란 스럽습니다. 리얼 모드 주소는'0xB800 : 0' (segment : offset)이다. 그것에 대응하는 물리적 주소는'0xB8000'입니다. –

+0

실제로 쓰는 기원은 할당 char far * p = 0xB8000000L을 기억하고있었습니다. 원거리 포인터는 4 바이트이므로 주소는 플랫 32 비트에 해당하는 것으로 지정됩니다. 비록 내가 개념 0xB800 : 0 텍스트에 더 동의합니다. 나는 그것을 편집 할 것이다 - 감사합니다 – fayyazkl