如何用汇编语言在单独的行中打印字符串字符?

时间:2016-10-31 10:38:19

标签: assembly

这是提供的代码之一,但我希望输出看起来像这样

"
A
B
C
.
.
.
Z
"

提供代码:

 .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 个答案:

答案 0 :(得分:1)

如果要检查ASCII表,您会看到有一些特殊字符。 在DOS中,具有int 21h函数的新行的字符序列是13,10。

因此,您可以修改dl以通过字母 - > int 21h,然后将其存储在某处,用13 + int 21h加载,用10 + int加载21h,将dl恢复为字母。

或者在.data中创建一个包含linestring db 'A', 13, 10, '$'的字符串,并在此行上保持打印(ah = 9,int 21h)26次,并递增inc byte ptr [linestring](递增第一个'A' == 65字节)。

或者,如果您仍然处于DOS年龄并做一些严肃的事情,那么您可以删除整个int 21h,然后直接在b800:0000更新视频ram。因为在性能方面,很多更快。

但是在80x25文本模式下,你不能在单个屏幕上显示所有26个字母,所以问题是你希望输出看起来如何(也许你想先设置更多行的文本模式?)。 / p>

例如:

    ... 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