【问题标题】:Assembly increment and loop装配增量和循环
【发布时间】:2013-12-02 07:25:36
【问题描述】:

我想知道如何使用循环和使用 ASCII 码的增量来显示这样的输出。

Aa Bb Cc ... Zz

这是我下面的工作代码,似乎有/很多错误。它变成了一个无限循环。

请检查并帮助我。

谢谢。

.model small
.stack 200h
.code

main proc

    mov ah, 0      
    mov al, 12h   ; Clear screen
    int 10h

    mov ah,3    
    mov bh,0     ; get cursor
    int 10h

    mov ah,2      
    mov bh,0      ;set cursor
    mov dl,12
    int 10h


    mov cx, 5      ; counter


t1:


    Mov dl, 65    ; A   
    mov ah, 2h
    int 21h

    add dl, 1


t2:

    Mov dl, 97    ; a
    mov ah, 2h
    int 21h

    add dl,1

loop t2

loop t1

    mov ah, 4ch
    mov al,00h
    int 21h



endp
end main

【问题讨论】:

  • 我不知道您对这两个连续的 loop 指令有何想法,但您可能应该在指令集参考中查找 loop 并了解它的工作原理。跨度>
  • 因为,我做的最后一个程序是循环和 A-Z 的递增......现在,我想要小写字母......
  • 好的。但是你确实意识到,当内循环结束时,CX 将为 0,这意味着外循环永远不会结束?

标签: assembly x86 ascii dos bios


【解决方案1】:
    mov cx, 5      ; counter
    Mov dl, 65    ; A   

t1:
    mov ah, 2h
    int 21h

    add dl, 32    ; 97 - 65 - convert to LC

    mov ah, 2h
    int 21h

    sub dl,31     ;remove the 32 added, but increment
    push dx       ;save DX on stack
    mov dl, 32    ;space character

    mov ah, 2h
    int 21h

    pop DX        ;return DX from stack

    loop t1

[根据迈克尔的评论修改 - Add dl,1 became sub dl,31]

(我已经省略了你的初始化和终止,这应该没问题)

您的问题是:

t1..t2 : 用'A' 加载DL 并输出;然后递增
t2..loop t2 指令:用'a' 加载DL 并输出它;然后递增
- 这样做 5(CX 的内容)次。请注意,您每次都使用'a' 加载DL
- 并且 CX 将在每个循环中递减,因此循环在 CX BECOMES 0
loop t2 时终止:接下来,循环回 t1 并重复直到CX 变成 0。

所以,在loop t1处,CX已经为0,因此被递减,程序循环回到t1,所以A被输出,直到CX再次变为0,之后循环65534。

【讨论】:

  • 谢谢!但是有一个问题,当我运行程序时,Aa 是没问题的。但其他不是,其他显示为符号。
  • 尝试将add dl,1 替换为sub dl,31
  • 很好,@Michael!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
相关资源
最近更新 更多