这是提供的代码之一,但我希望输出看起来像这样
"
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
答案 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