在程序集x86中打印数字三角形

时间:2017-01-19 13:54:14

标签: assembly x86 tasm

我必须在tasm中做一个必须在这样的数字上打印三角形的程序:

input: n.  Ex: n=4

output:

1
1 2
1 2 3 
1 2 3 4

我设法让我的程序打印这个东西,但我还必须使用0到255之间的数字,而不仅仅是数字。

我知道我必须逐位读取一个数字并创建一个这样的总和:

如果我必须阅读82,我首先读取8,将其放入寄存器,然后,当我读取2时,必须将其添加到8 * 10。

你能帮助我在我的程序中实现这个吗?

.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

1 个答案:

答案 0 :(得分:2)

你已经完成了一半。

"如果我必须阅读82,我首先读取8,将其放入寄存器,然后,当我读取2时,必须将其添加到8 * 10"

对于您读入的每个数字,您必须将前一个值乘以10.不仅是第二个,也是第三个(并且您可以为第一个执行此操作,因为读取的值为0)

剩下的是:

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

这样做,
82将是((0 * 10 + 8)+ 2)= 82
251将是(((0 * 10 + 2)* 10 + 5)* 10 +1 = 251

与在循环中输出数字相同,对于值> 9,你不能简单地添加' 0' 0并打印ascii值,你必须将其编码为ascii字符串,并显示整个字符串(就像你已经使用INT 21H / 09H一样)

也帮自己一个忙,并将这些问题分开。写一个" decode_bin"和" encode_bin"子函数,并用调用此函数替换循环中的INT,否则在2周左右之后你将无法读取它: - )