Home > database >  Converting value to another value
Converting value to another value

Time:07-04

I'm experimenting with my program by trying to build different kinds of pyramids and converting the values into different values. I managed to build one with asterisk sign and now I'm trying to find a way on how to change it into running numbers like "0123456789" and the next line is "012345678" and so on. Is there a way to do that without fully/less changes of my code?

CODE:

.MODEL SMALL
.STACK 100H
.DATA
STAR DB ?
BLANK DB ?
.CODE 

MAIN PROC
      MOV AX,@DATA
      MOV DS,AX

      MOV CX,10
      MOV BH,10
      MOV BL,0

      MOV STAR,BH
      MOV BLANK,BL

      L1:
      CMP BLANK,0
      JE L2

      MOV AH,2
      MOV DL,32
      INT 21H
      DEC BLANK

      JMP L1

      L2:
      MOV AH,2
      MOV DL,'*'
      INT 21H
      DEC STAR
      CMP STAR,0
      JNE L2

      MOV AH,2
      MOV DL,0AH
      INT 21H
      MOV DL,0DH
      INT 21H
      DEC BH    
      MOV STAR,BH
      INC BL    
      MOV BLANK,BL  
      LOOP L1

      EXIT:
      MOV AH,4CH    
      INT 21H

MAIN ENDP
END MAIN

CodePudding user response:

Consider a simplier algorithm which uses DOS function Int 21h/AH=09h (which displays $-terminated strings). You may shorten the string by overwriting characters at its end with '$' in each loop cycle:

.MODEL SMALL
.STACK 100H
.DATA
EOL DB 13,10,'$'         ; End of line string.
TXT DB '0123456789$'     ; The initial string.
.CODE 
MAIN PROC
      MOV AX,@DATA
      MOV DS,AX          ; Initialize DS to .DATA segment.   
      MOV AH,9           ; Use DOS function WRITE STRING TO STANDARD OUTPUT.
      MOV BX,10          ; Initialize the number of iteration (address index).
  L1: MOV DX,OFFSET EOL  
      INT 21H            ; Write EOL first.
      MOV [TXT BX],'$'   ; Terminate TXT at index BX.
      MOV DX,OFFSET TXT
      INT 21H            ; Write TXT.  
      DEC BX             ; Let BX index the previous character. 
      JNZ L1             ; Loop while BX > 0.
 EXIT:MOV AH,4CH    
      INT 21H
MAIN ENDP
END MAIN

Result should be this:

0123456789
012345678
01234567
0123456
012345
01234
0123
012
01
0

CodePudding user response:

I'm trying to find a way on how to change it into running numbers like "0123456789" and the next line is "012345678" and so on. Is there a way to do that without fully/less changes of my code?

While the other answer provides an alternative solution, my solution keeps most of your program intact as per request, only adding the digit sequence:

L2:
  mov dl, '0'            <--- Setup 1st digit
L3:                      <--- Extra label
  MOV AH,2
  INT 21H
  inc dl                 <--- To next digit
  DEC STAR
  CMP STAR,0             ; Tip: you can remove this instruction 
  JNE L3                 <--- To extra label

Expected output (similar to your asterisks):

0123456789
 012345678
  01234567
   0123456
    012345
     01234
      0123
       012
        01
         0
  • Related