0

良い一日!私はアセンブリ言語が初めてで、単純な「Hello World」を色付きで印刷しようとしています。動作しますが、たとえば を追加すると、13, 10改行は表示されず、他の文字 (音符と円) が表示されます。これが私のコードです:

.MODEL SMALL
.DATA
.stack

hello db 13,10,'Hello World'
      db 13,10,'    #####     ',0        ; there are spaces
ROW1 DB 12
COL DB 20

.CODE
.STARTUP
MOV AL, 3       ; 80x25 color
INT 10H         ; video BIOS call   
MOV AH, 2       ; set cursor position
MOV BH, 0       ; display page number
 mov bl,2
MOV DH, ROW1        ; row number
MOV DL, COL     ; column number
INT 10H         ; video BIOS call
CALL FAR PTR DISP   ; display first line of video text

.EXIT

DISP PROC FAR
        MOV SI, 0   ; set up array pointer
NEXT:   MOV AL, hello[SI]; get name character
    CMP AL, 0   ; exit if character is 0
    JZ EXIT     
    MOV BH, 0   ; display page number
    MOV BL, [BP+SI] ; get attribute
    MOV CX, 1   ; do 1 character
    MOV AH, 9   ; write character/attribute on screen
    INT 10H     ; video BIOS call
    INC SI      ; point to next character/attribute
    ADD DL, 1   ; move two columns to the right
    MOV AH, 2   ; set cursor position
    INT 10H     ; video BIOS call
    JMP NEXT    ; and continue
EXIT:   RET
DISP ENDP

END


変数に書き込まれた内容がhelloコンソールに表示される ようにコードを修正してください。また、点滅する色を取り除くにはどうすればよいですか? インターネットで色のリストを取得しましたが、ここに入力すると点滅します(mov bl, 2緑のように点滅します)。

4

2 に答える 2

0

とに関数0Ehを使用できます。カーソル位置を進めます:CRLF

ビデオ-テレタイプ出力

AH = 0Eh
AL=書き込む文字
BH=ページ番号
BL=前景色(グラフィックモードのみ)

説明:画面に文字を表示し、カーソルを進め、必要に応じて画面をスクロールします

注:文字07h(BEL)、08h(BS)、0Ah(LF)、および0Dh(CR)は解釈され、期待どおりの動作をします。

于 2013-03-10T21:53:20.283 に答える
0

Ralf Brown's Interrupt Listから、あなたの別の質問に答えたように:

INT 10 - VIDEO - WRITE CHARACTER AND ATTRIBUTE AT CURSOR POSITION
    AH = 09h
    AL = character to display
    BH = page number (00h to number of pages - 1) (see #00010)
        background color in 256-color graphics modes (ET4000)
    BL = attribute (text mode) or color (graphics mode)
        if bit 7 set in <256-color graphics mode, character is XOR'ed
          onto screen
    CX = number of times to write character
Return: nothing
Notes:  all characters are displayed, including CR, LF, and BS
    replication count in CX may produce an unpredictable result in graphics
      modes if it is greater than the number of positions remaining in the
      current row
    With PhysTechSoft's PTS ROM-DOS the BH, BL, and CX values are ignored
      on entry.

注: CR、LF、BS を含むすべての文字が表示されます

キャリアリターン (CR, 0x0d) は自分で解釈する必要があります。したがって、入力が0x0d( 1310 進数で) である場合は、以下で説明するように行います。それ以外の場合は、現在行っているように処理します。

int 10hしたがって、CR の場合、現在のカーソル位置を読み取り、次の呼び出しでカーソル位置を変更します。

まず、現在のカーソル位置を取得します。

INT 10 - VIDEO - GET CURSOR POSITION AND SIZE
    AH = 03h
    BH = page number
        0-3 in modes 2&3
        0-7 in modes 0&1
        0 in graphics modes
Return: AX = 0000h (Phoenix BIOS)
    CH = start scan line
    CL = end scan line
    DH = row (00h is top)
    DL = column (00h is left)
Notes:  a separate cursor is maintained for each of up to 8 display pages
    many ROM BIOSes incorrectly return the default size for a color display
      (start 06h, end 07h) when a monochrome display is attached
    With PhysTechSoft's PTS ROM-DOS the BH value is ignored on entry.

出力でdhは、現在の行です。そうしてinc dh、残りのパラメーターを次のように設定します。

INT 10 - VIDEO - SET CURSOR POSITION
    AH = 02h
    BH = page number
        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)

ただし、一番下の行にいて、入力に CR がある場合は、質問で何をしたいのかを述べていません。その状況も確認して、好みの方法で処理する必要があります。

その後:

inc si
jmp next
于 2013-03-10T17:39:22.410 に答える