简体   繁体   English

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

[英]Print triangle of numbers in assembly x86

I must do a program in tasm which have to print a triangle on numbers like this:我必须在 tasm 中做一个程序,它必须在这样的数字上打印一个三角形:

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.我设法让我的程序打印了这个东西,但我还必须让它处理 0 到 255 之间的数字,而不仅仅是数字。

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.如果我必须读82,我先读8,把它放在一个寄存器中,然后,当我读2时,它必须加到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

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" “如果我必须读82,我先读8,把它放在一个寄存器中,然后,当我读2时,它必须加到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)对于您读入的每个数字,您必须将前一个值乘以 10。不仅对于第二个,对于第三个也是如此(并且您可以对第一个执行此操作,因为读取的值为 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 82 将是 ((0*10 + 8) + 2) = 82
251 will be (((0*10 + 2) *10 + 5) *10 +1 = 251 251 将是 (((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 )与在循环中输出数字相同,对于大于 9 的值,您不能简单地添加“0”并打印 ascii 值,您必须将其编码为 ascii 字符串,并显示整个字符串(就像您已经使用 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 :-)编写一个“decode_bin”和一个“encode_bin”子函数,并用对这个函数的调用替换循环中的 INT,否则你将在 2 周左右后无法读取它:-)

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

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