2017-05-11 1 views
0

나는 학교에서 새로운 langange를 시작하고 있습니다. (어셈블리), 나는 그 클래스에 대한 작업을해야합니다. DOSBox 0.74에서 일하고 있습니다. 모든 콘솔 컨텐츠 바이저를 배열에 저장하는 기능이 필요하지만 어떻게 할 수 있습니까? 시도해 보았습니다.콘솔 바이저 내용을 배열 (어셈블리)에 저장

salva_ecran proc 
     xor  bx,bx 
     mov  cx,25*80 

salva:   
     mov dl, es:[bx] 
     mov consoleText[bx], dl 
     inc bx 
     cmp bx, cx 
     jb salva 
     ret 
salva_ecran endp 

그러나 작동하지 않았습니다. 내 변수는 consoleText db 80 dup (25 dup (?),13,10)입니다.

ps : 정말 신입입니다. 질문이 터무니 없거나 코드가 좋지 않고 비효율적 인 경우 미안합니다.

답변

1

consoleText 정의는 그래서 당신은 저장에 필요한 모든 consoleText db 80*25 dup (?), 당신은 mov consoleText[bx], dl하여 그들을 덮어 쓸 가능성이 80x27 바이트 (25x82하지!), 그 13,10은 어떤 식 으로든 쓸모가있다.

mov dl, es:[bx]es이 코드 조각에서 보이지 않는 경우 es으로 설정하면 텍스트 모드의 비디오 RAM을 읽을 수 있습니다.

80x25의 텍스트 모드 비디오 RAM (모드 03h)은 문자 당 2 바이트를 사용하지만 쌍의 첫 번째 바이트는 확장 ASCII 코드이고 두 번째 바이트는 색상이있는 속성이며 아마도 https://en.wikipedia.org/wiki/VGA-compatible_text_mode 및 기타 리소스를 참조하십시오. 따라서 문자의 절반과 색상의 절반 만 읽으면 mov dl, es:[bx*2]이 리얼 모드로 작동하는 것으로 생각되는 모든 문자 만 읽을 수 있습니다. 또는 bx 대신 si을 사용하십시오. 16b 리얼 모드에서는 bx*2 어드레싱 모드를 사용할 수 없습니다.

비디오 메모리에서 새 라인이 비디오 메모리에서 시작합니다. 비디오 RAM에 13,10이 없습니다. 실제 유효한 글립 문자 (13은 음표 IIRC입니다)이므로 B800:0000의 첫 번째 160 바이트는 첫 번째 라인입니다. 80 자 (색상 포함)이면 160 번지 (B800:00A0)에 두 번째 줄이 바로 시작됩니다.

저장된 콘텐츠를 확인/인쇄하는 방법이 명확하지 않으므로 "작동하지 않음"이 무엇인지 알기 어렵습니다. 항상 디버거를 사용하여 예상대로 값을 가져 왔는지 확인하십시오.

전체 텍스트 모드 VRAM을 저장/복원하려면 물론 색상 (80 * 25 * 2 바이트 버퍼)을 저장하고 복원해야하며 실행중인 앱의 시작 부분이 변경되지 않는 경우에만 작동합니다. VRAM 또는 다른 VGA 컨트롤 레지스터로 출력에 영향을 미칩니다 (예 : 원래 mov ax,3 int 10h 상태에서만). 또한 이러한 저장/복원은 BIOS 커서 위치 및 기타 BIOS 변수를 복원하지 않으므로 "콘솔"을 실제로 저장하려면 VRAM 컨텐츠를 복사하는 것보다 더 많은 작업이 필요합니다.

하지만 전반적으로이 코드는 간단하고 올바르게 이해할 수 있으며 기본 사항을 배우는 동안 성능에 대해 걱정하지 않아도됩니다. 그러나 디버거를 효과적으로 사용하는 방법을 배우는 것이 (어셈블리 학습의) 미래에 필수적입니다. 쌍으로 화면에

0

숯을 : 문자 및 색상, 당신은 단지 당신의 변수 크기를 두 배로 할 필요가 있으므로 (카운터를!) :

.model small 
.stack 100h 
.data 

some_text db 'StackOverflow!',13,10,'$' 
consoleText db 80*25*2 dup(?) ;◄■■ * 2 

.code 
    mov ax, @data 
    mov ds, ax 

    mov ax, 0b800h 
    mov es, ax 

    mov ah, 9 
    lea dx, some_text 
    int 21h 

    call salva_ecran 

    mov ax, 4c00h 
    int 21h 

salva_ecran proc 
     xor  bx,bx 
     mov  cx,25*80 * 2 ;◄■■ * 2 

salva:   
     mov dl, es:[bx] 
     mov consoleText[bx], dl 
     inc bx 
     cmp bx, cx 
     jb salva 
     ret 
salva_ecran endp 
+0

감사 남자! 당신은 내 문제를 해결했습니다! : D –

+0

CX 2000의 "rep movsw"에 대해 언급하는 것은 어떨까요? ;) – Tommylee2k

+0

@ JoãoRodrigues, 나는 여전히 내 대답의 ✔ 체크 표시를 클릭하기를 기다리고있다. :) –