-3

I must do a program in tasm which have to print a triangle on numbers like this:

input: n.  Ex: n=4

output:

1
1 2
1 2 3 
1 2 3 4

I've managed to make my program print this thing, but i also have to make it work with numbers between 0 and 255, not only for digits.

I know that i have to read a number digit by digit and create a sum like this:

if i have to read 82, i read firstly 8, put it in a register, and then, when i read 2, it must be added to 8*10.

Can you help me to implement this in my program?

.model small
.stack 100h

.data
    msg db "Enter the desired value: $", 10, 13
    nr db ?

.code
    mov AX, @data
    mov DS, AX

    mov dl, 10
    mov ah, 02h
    int 21h
    mov dl, 13
    mov ah, 02h
    int 21h

    mov DX, OFFSET msg
    mov AH, 9
    int 21h
    xor ax, ax

    mov ah, 08h                 ;citire prima cifra din numar
  int 21h


  mov ah, 02h   
  mov dl, al
  int 21h   

 sub al,30h  
  mov ah,10
  mul ah                

  mov [nr],al         ;mutam prima cifra inmultita cu 10 in nr

  mov ah, 08h 
  int 21h   



  mov ah, 02h         
  mov dl, al
  int 21h

  sub al, 30h         
  add [nr], al 


    sub nr,30h

    mov dl, 10
    mov ah, 02h
    int 21h
    mov dl, 13
    mov ah, 02h
    int 21h

    mov cx,1

    mov bx,31h
    mov ah, 2
    mov dx, bx
    int 21h 

loop1:
    xor ax, ax
    mov al, nr
    cmp ax, cx
    je final

    mov dl, 10
    mov ah, 02h
    int 21h
    mov dl, 13
    mov ah, 02h
    int 21h

    mov bx, 0             

loop2:  
    inc bx               
    add bx,30h
    mov ah, 2
    mov dx, bx
    int 21h 
    sub bx,30h
    cmp bx, cx           
    jne loop2

    inc bx               
    add bx,30h
    mov ah, 2
    mov dx, bx
    int 21h 

    inc cx
    jmp loop1

final:
    mov AH,4Ch   ; Function to exit
    mov AL,00    ; Return 00
    int 21h

end
Cosmin Baciu
  • 43
  • 3
  • 7
  • Since you know you need to do `x*10+y` what's causing you problem? Can you not perform that? That's trivial, but also plenty of examples for it even here on SO. – Jester Jan 19 '17 at 13:57
  • As you will be doing many number->ascii conversion, you may consider optimization. Drawing first whole last line in memory buffer, then patching it for every line to display only required amount of numbers, and simply printing just the buffer, no more doing any number math. Actually it's possible to generate that initial print of last line even without working with numbers, just patching ASCII strings. – Ped7g Jan 19 '17 at 14:54
  • I have edited my code above. I've managed to read a two digit number but now i don't know how to print them. This code print all ASCII characters and i don;t see the logic. – Cosmin Baciu Jan 19 '17 at 20:53

1 Answers1

2

you're half way done.

"if i have to read 82, i read firstly 8, put it in a register, and then, when i read 2, it must be added to 8*10"

For EACH digit you read in, you have to multiply the previous value by 10. not only for the 2nd, also for the 3rd (and you can do this for the first, since the value read there was 0)

what remains is:

  result = 0
  while (more digits to come)
      result *= 10;
      result += value of current digit

doing this,
82 will be ((0*10 + 8) + 2) = 82
251 will be (((0*10 + 2) *10 + 5) *10 +1 = 251

same with outputting your numbers in the loop, for values > 9, you cannot simply add '0' and print the ascii value, you have to encode it as an ascii string, and display the whole string ( like you already did with INT 21H/09H )

Also do yourself a favour, and divide these problems. Write a "decode_bin" and a "encode_bin" sub-functions, and replace the INTs in your loop with calls to this functions, otherwise you'll not ba able to read it, after 2 weeks or so :-)

Tommylee2k
  • 2,683
  • 1
  • 9
  • 22