16 비트 TASM 프로젝트에서 작업 중이며 상당 부분이 비디오 메모리에 상당히 많이 액세스하고 있습니다. 이 프로젝트는 320x200x256 VGA 모드에, 나는 도스 박스8086 어셈블리 비디오 메모리 불일치
나는/입력 프로그램의 시작 화면을 닦아 지침의 설정 다음 한 예를 들어를 통해 실행 해요 :
GFXMode proc ;Initialize 256-Color Graphics Mode [Args: None] [Returns: None]
push ax
mov ax, 0013h
int 10h
mov ax, 0a000h
mov es, ax
pop ax
ret
GFXMode endp
RefreshOff proc ;Disables screen refresh while drawing [Args: None] [Returns: None]
push ax bx
mov ax, 1201h
mov bl, 36h
int 10h
pop bx ax
ret
RefreshOff endp
FillScreen proc ;Fills screen with a certain color [Args: 8-bit Color] [Returns: None]
push bp
mov bp, sp
push ax bx
mov al, ss:[bp + 4] ;Color
mov bx, 0h
_fillScreenNextPixel:
mov es:[bx], al
inc bx
cmp bx, 0ffffh
jb _fillScreenNextPixel
pop bx ax bp
ret 2
FillScreen endp
RefreshOn proc ;Shows changes on screen [Args: None] [Returns: None]
push ax bx
mov ax, 1200h
mov bl, 36h
int 10h
pop bx ax
ret
RefreshOn endp
그리고 FillScreen 함수는 일반적으로 0FFh로 주어 지므로 흰색을 그려야합니다.
나는 TASM과 협력하고 있기 때문에 Turbo Debugger를 함께 사용하여 디버깅을 해왔습니다. 그리고 정말 이상한 일들이 일어나고 있습니다. 디버거에서 F7을 눌러 라인 단위로 진행할 수 있습니다. 또는 F9를 눌러 끝까지 건너 뛸 수 있습니다. 그래서 나는 F 세그먼트를 한 번 두 번 눌러 F7을 붙잡고 (나는 더 이상 가질 수 없을 때까지)
언제, es 세그먼트 (두 경우 모두 A000으로 설정)의 내용을보고 있습니다. F9를 누르면 화면에 모든 것이 나타나지만 비디오 메모리에는 아무 것도 지정되어 있지 않습니다. 전혀. 프로그램의 끝에서 나는 es 내부에 아무것도 있는지 확인하고 그것은 모두 0입니다.
몇 분 동안 F7을 길게 누르면 레지스터에 값이 표시되는 것을 볼 수 있으므로 그곳에 있다는 것을 알았지 만 몇 백 픽셀 후에 키를 누르고 그냥 놓아 두지 않으면 , 값 할당이 중지됩니다. 내가 화면을 볼 때 반은 한 색이고 반은 다른 반입니다.
내 디버거에 문제가 있는지, dosbox 또는 내 코드에 무엇이 있는지는 잘 모르겠지만, 나중에이 값에 액세스 할 수 있도록이 값을 어딘가에 유지해야합니다. 근본적으로, 도대체 내 프로그램에 무엇이 있습니까?
편집 : 이미지를 게시 할 담당자가 없으므로 http://puu.sh/3iKhw.png은 0x600 픽셀에 대해 F7을 누른 상태에서 색상 0x3B를 놓으면 모양이 같습니다. 중간에 라인은, 당신은 좀 더 행운도 F9FF에서 중지 도움이 될 수
mov es:[di], al
inc di
cmp di, 0ffffh
이있을 수 있습니다, 당신은 ES 및 사용 디에 B800 스틱 경우
뭐죠 비디오 메모리 위치입니까? B800 : xxxx는 일반적인 출력입니다. – ady
ret 2 - 그게 무슨 뜻입니까? pop bx ax bp가보기에 편리합니다. 전에 보지 못했습니다. – ady
값을 'es'에 할당하는 위치를 표시하지 않으므로, 특정 위치에 특정 값이있을 것으로 예상되는지 여부를 말하기 어렵습니다. 프로그램. 그런데'REP STOSB'를 사용하면'FillScreen' 과정을 상당히 단순화 할 수 있습니다. – Michael