0

画面(dosbox)に書かれたものをテキストモードで保存し、画面をクリアしてから以前に書かれたものを復元するアセンブリコードを書く必要があるので、このコードを書きましたが、正しく動作していないようです..誰でも理由を指摘できますか?本当に感謝します

PS:私はまだ初心者です

これが私のコードです:

Dataseg segment
    Data_seg dw 2000 dup(?)
Dataseg ends


Codeseg segment

Main PROC  far   

            assume ds:Dataseg,cs:Codeseg,ss:stackseg

        Mov ax,Data_seg
        Mov es,ax
        Mov ax,0b800h
        Mov ds,ax       
        Mov cx,25*80 ;(rows)*cols-default for screen

        Mov di,OFFSET Data_seg
        Mov si,0   
        CLD             ;autoincrement
        Rep movsw


        ;now clearing the screen

        Mov cx,25*80
        Mov ax,0b800h
        Mov es,ax
        Mov ax,0720h
        Mov di,0
        Rep stosw


        ;now restoring the contents of the screen
       Mov ax,Data_seg
       Mov ds,ax
       Mov cx,25*80
       Mov di,0
       Mov si,OFFSET Data_seg
       Rep movsw





     Mov Ah,4ch
     Int 21h


Main endp
Codeseg ends
     end Main
4

2 に答える 2

0

"Dataseg" (セグメントの名前) と"Data_seg" (変数の名前) を混同しました。セグメントではなくVariableのオフセットMov ax,Data_segをロードします。セグメントをロードするには、次の 2 つのオプションがあります。Data_seg

Mov ax, SEG Data_seg    ; Load the segment of variable Data_seg

また

Mov ax, Dataseg         ; Load the segment called "Dataseg" 
于 2014-11-22T19:22:22.400 に答える
0

交換:

Mov ax,Data_seg
Mov es,ax
Mov ax,0b800h
Mov ds,ax
Mov di,OFFSET Data_seg
    Mov si,0

に:

push cs
pop es
mov di, OFFSET Data_seg
Mov ax,0b800h
Mov ds,ax 
xor si, si ;set pointer to the beginning of the screen

交換:

   Mov ax,Data_seg
   Mov ds,ax
   Mov cx,25*80
   Mov di,0
   Mov si,OFFSET Data_seg
   Rep movsw

に:

   push cs
   pop ds
   mov ax, 0b800h
   mov es, ax
   Mov cx,25*80
   Mov di, 0
   Mov si,OFFSET Data_seg
   Rep movsw
于 2014-11-23T13:27:33.657 に答える