繁体   English   中英

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

[英]Print triangle of numbers in assembly x86

我必须在 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

你已经完成了一半。

“如果我必须读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”并打印 ascii 值,您必须将其编码为 ascii 字符串,并显示整个字符串(就像您已经使用 INT 21H 所做的那样/09H )

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

暂无
暂无

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

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