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

时间:2016-08-10 01:15:05

标签: assembly ascii dos tasm x86-16

程序必须使用循环显示从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

2 个答案:

答案 0 :(得分:1)

您必须添加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

答案 1 :(得分:1)

如果您希望它们穿插,则ASCII字符集在大写和小写字母之间的偏移量为20h

enter image description here

您可以从该表中看到,从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.