繁体   English   中英

如何在 8086(程序集)中的模式内打印空格?

[英]How to print spaces in between within a pattern in 8086 (Assembly)?

也许这是一个已经回答的问题。 我正在尝试用心创建一个平行四边形图案,它可以工作,但很遗憾,每当我尝试在字符之间添加空格时; 他们中的大多数消失了。 我认为这是因为 CL 寄存器,或者我可能忽略了某些部分。 我尝试了不同的试验和错误来获得预期的输出。 不幸的是,我仍然是这种push-and-pop方法的初学者,所以请多多包涵。 此外,这是一个直角三角形的代码,我已经将其调整为平行四边形。

我在 DOSBOX 上使用 TASM-TLINK 模拟了这个。

下面是代码:

.MODEL TINY
.386
.DATA
.CODE
    ORG 100H

BEGIN:
    MOV BL,4
    MOV CL,4
    
    ;    * * * *
    ;   * * * *
    ;  * * * *          ; THE EXPECTED PATTERN
    ; * * * *
    
    ;PUSH BX 
    
    L1:
    PUSH CX
    MOV AH,2
    MOV DL,20H ;INCREMENT SPACES
    
    ;SPACE:
    ;MOV AH,02
    ;MOV DL,20H
    ;INT 21H
    
    ;LOOP SPACE 
    ;POP CX 
       
    L2:
     INT 21H
     LOOP L2 
     
     MOV CL,BL 
     DEC CL
     MOV AH,2 ; PRINT THE CHARACTERS
     MOV DL,03H
     INT 21H
     ;MOV AH,02
     ;MOV DL,20H
     ;INT 21H
     
    L3:
     INT 21H
     LOOP L3 
     
     MOV AH,2 ; GENERATE NEW LINES
     MOV DL,10
     INT 21H
     MOV DL,13
     INT 21H

    DEC BH ; DECREMENT BH REGISTER TO TRIM PARALLELOGRAM 
    ;INC BH?
    POP CX
    ;PUSH BX 
    
    LOOP L1
       
    
    EXIT:
    MOV AH,4CH
    INT 21H
    INT 20H

END BEGIN

感谢任何花时间回答这个问题的人。 所有美好的祝愿!

一些要点

MOV BL,4 MOV CL,4

因为您的程序将使用依赖于CX寄存器的全部 16 位loop指令,所以您应该通过mov cx, 4进行设置,而不是依赖于从空寄存器开始的环境!

 DEC BH ; DECREMENT BH REGISTER TO TRIM PARALLELOGRAM ;INC BH?

你根本不需要这个指令。 这里没有什么可修剪的! 您在BL寄存器中设置的平行四边形的尺寸保持不变

 EXIT: MOV AH,4CH INT 21H INT 20H

mov ah, 4Ch 4Ch int 21h DOS.TerminateWithReturncode 已经结束了你的程序。 int 20h DOS.TerminateProgram永远不会执行,因此在这里完全没用。


您的评论表明您已经成功地重写了您的程序。 尽管如此,请在下面查看我的解决方案:

    MOV  AH, 02h   ; DOS.PrintCharacter
    MOV  BX, 4     ; Dimension of the parallelogram, 2 or more
    MOV  CX, BX    ; Leading whitespace
L1: PUSH CX        ; (1)
    MOV  DL, ' '
L2: INT  21h
    DEC  CX
    JNZ  L2

    MOV  DL, 3     ; Heart
    INT  21h
    LEA  CX, [BX-1]
L3: MOV  DL, ' '
    INT  21h
    MOV  DL, 3     ; Heart
    INT  21h
    DEC  CX
    JNZ  L3

    MOV  DL, 10
    INT  21h
    MOV  DL, 13
    INT  21h

    POP  CX        ; (1)
    DEC  CX
    JNZ  L1

因此,您不必稍后再学习它,避免使用loop指令。 请参阅为什么循环指令很慢? 英特尔不能有效地实施它吗? ?

预期输出(4 个空格从第一行开始):

    ♥ ♥ ♥ ♥
   ♥ ♥ ♥ ♥
  ♥ ♥ ♥ ♥
 ♥ ♥ ♥ ♥

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM