0

ネストされたループを使用し、次のパターンで文字を出力する単純なコードを作成しようとしています。

XXXXXXXXXX
XXXXXXXXX
XXXXXXXX
XXXXXXX
XXXXXX
XXXXX
XXXX
XXX
XX
X

ここにコードがあります。コードは完全に正常に動作します

   MOV AX, @DATA                ; INITIALIZE DS
    MOV DS, AX



    ; PRINT X

    MOV CX,10
    MOV BX,10

    L2:
        PUSH CX
        MOV CX,BX
            L1:
                MOV DX, OFFSET HW            ; LOAD THE STRING
                MOV AH,09H
                INT 21H
            Loop L1
        SUB BX,01
        POP CX

        MOV DX,0AH
        MOV AH,02H
        INT 21H
    Loop L2


    MOV AH, 4CH                  ; RETURN CONTROL TO DOS
    INT 21H

しかし、ビデオ割り込みを使用してクリアスクリーンを使用するとすぐに、出力が完全に台無しになります。

出力は次のとおりです。

XXXXXXXXXX
          XXXXXXXXX
                   XXXXXXXX
                           XXXXXXX
                                  XXXXXX
                                        XXXXX
                                             XXXX
                                                 XXX
                                                    XX
                                                      X

これがそのコードです。

.MODEL SMALL
 .STACK 100H

 .DATA
    HW  DB  "X$"

 .CODE
   MAIN PROC

    MOV AX, @DATA                ; INITIALIZE DS
    MOV DS, AX

    ; CLEAR SCREEN

    MOV AH, 06H
    MOV AL, 00H
    MOV CX, 00H
    MOV DH, 25
    MOV DL, 80
    MOV BH, 0FH 
    INT 10H

    ; PRINT X

    MOV CX,10
    MOV BX,10

    L2:
        PUSH CX
        MOV CX,BX
            L1:
                MOV DX, OFFSET HW            ; LOAD THE STRING
                MOV AH,09H
                INT 21H
            Loop L1
        SUB BX,01
        POP CX

        MOV DX,0AH
        MOV AH,02H
        INT 21H
    Loop L2





    MOV AH, 4CH                  ; RETURN CONTROL TO DOS
    INT 21H

   MAIN ENDP
 END MAIN

しかし、各反復後に行を残す改行を削除すると、つまり

MOV DX,0AH
MOV AH,02H
INT 21H

出力は期待どおりです。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

クリアスクリーンコードと改行コードの関係がわかりません。なぜ彼らはお互いを台無しにしています。?

クリアスクリーンの代わりにカーソル位置セットコードを使用している場合、同じ問題が発生します。

MOV AH, 02H
MOV BH, 00H
MOV CX, 0000H
MOV DX, 0C22H    
INT 10H

出力は、画面の中央にある次のようになります。

XXXXXXXXXX
XXXXXXXXX
XXXXXXXX
XXXXXXX
XXXXXX
XXXXX
XXXX
XXX
XX
X

以下のように表示されていますが、

                                 XXXXXXXXXX
                                           XXXXXXXXX
                                                    XXXXXXXX
                                                            XXXXXXX
                                                                   XXXXXX
                                                                         XXXXX
                                                                              X
XX
  XXX
     XX
       X
4

1 に答える 1

2

コードの一部:

MOV AH, 02H
MOV BH, 00H  ----> this is page number
MOV CX, 0000H
MOV DX, 0C22H   --->why such big number for column number?
INT 10H

なぜページ0hを使用しているのですか? あなたがそのページを使用していることは確かですか?どのように?私はそのことを知っています:

ビデオ - 現在のビデオ モードを取得する

AH = 0Fh
int 10h
Return:
AH = number of character columns
AL = display mode (see #00010 at AH=00h)
BH = active page (see AH=05h) ---------------->you will need this

ビデオ - カーソル位置の設定

AH = 02h
BH = page number  <--------------now you know what to put here
0-3 in modes 2&3
0-7 in modes 0&1
0 in graphics modes
DH = row (00h is top)
DL = column (00h is left)
int 10h

Return:
Nothing

出典: Ralph Brown の割り込みページ

表示ページ

グラフィックス アダプタは、テキスト データの複数の画面を格納できます (これは、グラフィックスの 1 つの画面を表示するために、テキストよりもはるかに多くのメモリが必要になるためです)。表示メモリを十分に使用するために、表示ページに分割されています。1 つの表示ページで 1 画面分のデータを保持できます。ページ番号は 0 から始まります。使用可能なページ数は、アダプターと選択した表示モードによって異なります。

80 x 25 テキスト モードの場合、各表示ページは 4 KB です。テキスト モードの表示ページ 0 は、アドレス B800:0000h から始まります。

アクティブな表示ページは、現在表示されているページです。80 x 25 テキスト モードの場合、必要なメモリは 80 x 25 = 2000 ワード = 4000 バイトです (つまり、ディスプレイはディスプレイ ページ メモリの 4 KB または 4096 バイトをすべて使用するわけではありません)。

ビデオ コントローラは、アクティブな表示ページの最初の WORD を画面の左上隅 (0,0) に表示し、次の WORD を (1,0) などに表示し、行ごとに画面を表示します。画面表示は二次元配列のイメージとして見ることができます。

INT 10h Video Functions

00h: Set Video Mode.  Selects the video mode and clears the screen automatically.
Input:
    AH = 0
    AL = 3        ; mode 3 = 80 cols   x 25 rows color text
                  ; to avoid clearing the screen use mode 83h to set high bit
    AL = 6        ; sets medium resolution (640 x 200) graphics mode

When BIOS sets the display mode, it also clears the screen.

01h: Change Cursor Size
Input:
   AH = 1
   CH = starting scan line
   CL = ending scan line

The text mode cursor is displayed as a small dot array at a screen position. For the MDA and EGA, the dot array is 14 rows (0-13). For the CGA, the array is 8 rows (0-7). Normally rows 6 and 7 are lit for the CGA and rows 11 and 12 for the MDA/EGA cursor.

02h: Set Cursor Position.  Move cursor to specified position.
Input:
    AH = 2
    DH = row  (0-24)
    DL = col  (0-79 for 80x25 display)
    BH = video page number (usually 0)

03h: Get Cursor Position.   Return row and column position of cursor.
Input:
    AH = 3
    BH = video page number (usually 0)

Output:
    DH = row                     ; position
    DL = col
    CH = starting scan line     ; size
    CL = ending scan line

06h: Scroll the Screen or a Window Up
Input:
    AH = 6
    AL = number of lines to scroll (0 => whole screen)
    BH = attribute for blank lines
    CH, CL = row, column for upper left corner
    DH, DL = row, column for lower right window

Scrolling the screen up one line means to move each display line UP one row and insert a blank line at the bottom of the screen. The previous top row disappears from the screen.

The whole screen or any rectangular area (window) may be scrolled. AL contains the number of lines to scroll. If AL = 0, all the lines are scrolled and this clears the screen or window.

Example: Clear the screen to black for the 80x25 display.

MOV AH, 6      ; scroll up function
XOR AL, AL     ; clear entire screen
XOR CX, CX     ; upper left corner is (0,0)
MOV DX, 184FH  ; lower right corner is (4Fh, 18H)
MOV BH, 7      ; normal video attribute
INT 10H        ; clear screen

07h: Scroll the Screen/Window down
Input:
    AH = 7
    AL = number of lines to scroll (0 => whole screen)
    BH = attribute for blank lines
    CH, CL = row, column for upper left corner 
    DH, DL = row, column for lower right corner

Same as function 6, but lines are scrolled down instead of up.

08h: Read character at cursor. Can be used in either text or graphics mode.
Input:   AH = 8
         BH = page number
Output:  AH = attribute
         AL = ASCII code of character

09h: Write character and attribute.   Display any ASCII character at current position and set desired attribute.   Can be used in graphics or video mode.
Input:
    AH = 09
    AL = ASCII character code
    BH = video page number (usually 0)
    BL = attribute to be used. (In video mode, sets foreground (pixel) color)
    CX = repetition count

Note: cursor will not be moved beyond the last character displayed.

Also, if AL contains the ASCII code of a control character, a control function is not performed --- a display symbol is shown instead.

Example: change the attribute of the character under the cursor to reverse video for monochrome display.

        MOV AH, 8     ; read character
        XOR BH, BH    ; on page 0
        INT 10H       ; character in AL, attribute in AH

        MOV AH, 9     ; display character
        MOV CX, 1     ; display 1 character
        MOV BL, 70H   ; reverse video attribute
        INT 10H       ; display character  

0Ah: Write character.  Display any ASCII character at current position without changing the current attribute.  Can be used in text or video mode.
Input:
    AH = 0Ah
    AL = ASCII character code
    BH = video page number (usually 0)
    CX = repetition count

0Eh: Display Character and Advance Cursor
Input:   AH = 0Eh
         AL = ASCII code of character
         BH = page number
         BL = foreground color (graphics mode only)

This function displays the character in AL and advances the cursor to the next position in the row, or if at the end of a row, it sends it to the beginning of the next row. If the cursor is in the lower right corner, the screen is scrolled up and the cursor is set to the beginning of the last row. This is the BIOS function used by INT 21h, function 2, to display a character. The control characters bell (07h), backspace (08h), line feed (0Ah), and carriage return (0Dh) cause control functions to be performed.

ソースはこちら

于 2012-09-08T14:32:30.990 に答える