【问题标题】:Printing a triangle of characters in assembly在汇编中打印一个三角形的字符
【发布时间】:2021-01-29 15:05:51
【问题描述】:

我正在开发这个练习:

编写一个汇编程序,给定一个字符作为输入,输出一个字符本身大小为 5 x 5 的三角形。

我有一个问题,因为当我去输入一个字符时,这些字符没有形成一个三角形,而是打印了其他字符。

我的意见:

f

我的输出:

期望的输出:

f
ff
fff
ffff
fffff

我的代码:

Title PROVA
;programma per la prova dell’ambiente Turbo Assembler 

DOSSEG
.MODEL SMALL
.STACK 100 
.DATA 
; se ci sono qui vanno dichiarate le vriabili

.CODE
  MOV AX, @data  ;(obbligatorie) inizializzano il DS      
  MOV DS, AX 
  
  MOV AX, 00
  MOV BX, 00
  MOV CX, 00
  MOV DX, 00

  mov ah,01h ;input va a mettere l'input in AL ;n
  int 21h
  MOV BL, AL ;n
  MOV CL, BL ;n
  
  MOV CH, 0H
  
  ciclo:
  CMP CH, 5H
  JE fine

  inc CH

  MOV DL, BL
  mov ah, 02h  ;stampa il contenuto di dl
  int 21h

  mov DL, 10D
  int 21h
  mov DL, 13D
  int 21h
  
  ;BL
  ADD BL, CL 
  
  JMP ciclo

  fine:
  MOV AL, 00H  ;(obbligatorie) ritornano il controllo al sistema operativo      
  MOV AH, 4CH 
  INT 21H 
 
END  

【问题讨论】:

  • 我在你的代码中只看到一个循环。为了打印该形状,我预计会有两个循环,即类似for (row = 0; row < 5; row++) { for (col = 0; col <= row; col++) { printf(character); } }
  • 您在 BL(和 CL)中保留 要打印的字符,但是您在每个 新行 之后将 CL 添加到 BL,这是错误的。为了显示一个字符 1..5 次,您必须重复 int 21h 1..5 次。使用 TurboDebugger。

标签: assembly x86-16 tasm


【解决方案1】:

正如 vitsoft 指出的那样,字符发生了变化,因为您将 CL 添加到 BL。 正如迈克尔所说,要制作三角形,您需要使用另一个循环。 以下是要更改的部分:

  MOV   AH, 01h  ; input va a mettere l'input in AL ;n
  INT   21H
  MOV   BL, AL   ; n
  
  MOV   CH, 0H
ciclo:
  CMP   CH, 5H
  JE    fine
  INC   CH
  
  MOV   DL, 10D
  INT   21H
  MOV   DL, 13D
  INT   21H
  
  MOV   CL, CH
  MOV   AH, 02H  ; stampa il contenuto di dl
  MOV   DL, BL
innerLoop:
  INT   21H
  DEC   CL
  JNE   innerLoop

  JMP ciclo

fine:

【讨论】:

  • 您的程序失败,因为MOV AH, 02H 指令不在正确的位置!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 2015-04-05
  • 1970-01-01
相关资源
最近更新 更多