使用循环显示从 a 到 z 的字母(水平交替大写和小写)的 TASM 程序

TASM program that display letters from a to z (alternate uppercase and lowercase horizontally) using looping

程序必须使用循环显示从 az 的字母(水平交替大小写)。

样本输出:

AaBb . . . . . . . . . . . . YyZz

这是我目前使用的代码,但它只输出大写字母。请帮助我如何组合这些小写字母:(

谢谢:)

.model small
.code
.stack 100
org 100h 
start :
       mov  ah, 02h
       mov   cl, 41h 
skip :
       mov  dl, cl
       Int     21h   
       inc    cl
       cmp  cl, 5Ah
       jnz   skip
       Int    27h
end start

您必须添加 20(十六进制)才能显示小写字母。 像这样:

 start :
     mov  ah, 02h
     mov  cl, 41h 
 skip :
     mov   dl, cl
     Int   21h   
     add   dl, 20h
     Int   21h
     inc   cl
     cmp   cl, 5Ah
     jnz   skip
     Int   27h
 end start

更新

另一种方法:

 start :
     mov  ah, 02h
     mov  cl, 41h 
 skip :
     mov   dl, cl
     Int   21h   
     xor   dl, 20h
     Int   21h
     inc   cl
     cmp   cl, 5Ah
     jnz   skip
     Int   27h
 end start

如果要穿插,ASCII字符集大小写字母之间有20h的偏移量:

从 table 可以看出,从 A 移动到 a 需要添加 20h(从 41h 移动到 61h) 这对所有其他字母也是一样的。

因此,您必须首先:

而不是简单地在循环末尾添加一个
  • 添加20h.
  • 打印那个字符。
  • 减去 1fh(即减去 20h 然后加一)。

换句话说,改变:

mov  dl, cl
int  21h
inc  cl

变成类似这样的东西:

mov  dl, cl     ; load dl with character and print.
int  21h

add  cl, 20h    ; move to lowercase variant and print.
mov  dl, cl
int  21h

sub  cl, 1fh    ; move back to next uppercase variant.

如果您知道中断不会破坏您正在使用的 dl 寄存器,则可以缩短代码(出色的 Ralf Brown interrupt list 似乎表明确实如此,说明只有 al 改变了):

mov  dl, cl     ; load dl with character and print.
int  21h

add  dl, 20h    ; move dl to lowercase variant and print.
int  21h

inc  cl         ; move cl to next uppercase variant.