2016-10-31 10 views
-1

これは提供コードの一つであるが、私は、出力がこのアセンブリ言語で文字列を別々の行に出力する方法は?

" 
A 
B 
C 
. 
. 
. 
Z 
" 

提供されたコードのようなものを見てみたい:あなたはASCIIテーブルをチェックした場合

.MODEL SMALL 
.STACK 100H 

.DATA 
PROMPT DB 'The Upper Case Letters from A to Z are: $' 

.CODE 
    MAIN PROC 
    MOV AX, @DATA    ; initialize DS 
    MOV DS, AX 

    LEA DX, PROMPT    ; load and print PROMPT 
    MOV AH, 9 
    INT 21H 

    MOV CX, 26     ; initialize CX 

    MOV AH, 2     ; set output function 
    MOV DL, 65     ; set DL with A 

    @LOOP:      ; loop start 
     INT 21H     ; print character 

     INC DL      ; increment DL to next ASCII character 

     DEC CX      ; decrement CX 

    JNZ @LOOP     ; jump to label @LOOP if CXis 0 

    MOV AH, 4CH     ; return control to DOS 
    INT 21H 
    MAIN ENDP 
END MAIN 
+1

を使用すると、各文字の後に印刷しようとしたことがあり、キャリッジリターンとラインのための文字は、フィード? ASCIIコード:(0Dh、0Ah) –

答えて

1

は、あなたには、いくつかの特別な存在でしょう文字。 int 21h機能を持つ新しい行の文字列が13であるDOSで 、10したがって

あなたはどちらかトラフ手紙行きdlを変更することができます - 13 + INT 21Hでそれをロードし、その後、どこかに保管し、> INT 21Hを、負荷それは10 + int 21hで、dlを文字に復元します。

または.DATAでlinestring db 'A', 13, 10, '$'を含む文字列を作成し、印刷を続ける(AH = 9、int型21H)、このライン26回(第一'A' == 65バイトインクリメント)inc byte ptr [linestring]をインクリメント有します。


か、DOSの時代にまだあることと、深刻な何かをするならば、あなたは全体のint 21hをドロップするでしょうし、あなたは、単に直接b800:0000でビデオラムを更新します。それはだったので、多くの場合、パフォーマンス面でもっと速くでした。

80x25のテキストモードでは、1つの画面に26文字すべてを入力することはできません。そのため、出力をどのように表示するかが問題になります。例のように

... some init? 
    mov ax,0B800h 
    mov es,ax 
    xor di,di  ; es:di = upper left corner of text mode video ram 
    mov ax,0A00h + 'A' ; light green color on black, 'A' letter 
    mov cx,25  ; only 25 letters will fit on screen in 80x25 mode 
lineLoop: 
    mov es:[di],ax 
    add di,80*2 ; next line is 80*2 (2 bytes per character, 80 chars width) 
    inc al  ; next letter 
    dec cx 
    jnz lineLoop 
    ... exit to DOS 
関連する問題