在程序集x86中打印多位数的三角形

时间:2017-01-20 10:11:08

标签: assembly x86

我必须做一个程序,它读取0到255之间的数字并打印半金字塔,如下所示:

input: 4

output:

1
1 2
1 2 3
1 2 3 4

我设法为0到9之间的数字做了这件事,但我真的不能用两位或三位数字来做。

请参阅以下代码

.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                 
  int 21h


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

 sub al,30h  
  mov ah,10
  mul ah                

  mov [nr],al         

  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
    call function
    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


    function:   


    MOV BX,10 

ASC2:
        mov dx,0            ; clear dx prior to dividing dx:ax by bx
        DIV BX              ;DIV AX/10
        ADD DX,48           ;ADD 48 TO REMAINDER TO GET ASCII CHARACTER OF NUMBER 
        dec si              ; store characters in reverse order
        mov [si],dl
        CMP AX,0            
        JZ EXTT             ;IF AX=0, END OF THE PROCEDURE
        JMP ASC2            ;ELSE REPEAT

EXTT:
        mov ah,9            ; print string
        mov dx,si
        int 21h

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

1 个答案:

答案 0 :(得分:0)

(它下面的每个段落都有一个错误/问题,需要解决......也许你应该从头开始尝试写一些更优雅的东西,因为这有点"凌乱" )

什么是sub nr,30hadd [nr], al之后)?你能解释一下,它做了什么?试着想象一下,[nr]中的值是什么,以及该子对它做了什么。你必须决定,无论你是使用数字值还是ASCII字符,都不要盲目地将两者混合在一起。

移动那些"新线"序列分成单独的过程,所以你可以call newline而不是那6行,它将更容易阅读源,你可以用push/pop包围它们来保存寄存器值。

为什么ah=8, int 21h输入char,然后输出?你可以使用ah=1" echo"输入然后。

add bx,30h
call function
再次

^^,如果bx15之类的数值,则在转换为ASCII之前向其添加'0'并不合理。它会将15转换为63,并显示"63"(如果您的" function"是正确的 - 它不是)。

int 21h做什么之后

call function

function:将不会返回。

function:就像参数一样在ax中,但主要代码是用bx调用它我猜...但是,bx内容将被销毁,而主要代码并不期望这样。

等等......太多了。只需删除它,然后重新开始。停止向代码添加随机指令,首先要确保您具有高级概述和清晰的想法,您想要使用哪个值和原因,然后只编写执行该操作的指令。经常在调试器中验证,2-6个新行执行你的EXPECT(因为它们很可能不会)。 "添加一堆指令并稍微修改它们,直到它能够正常工作"方法可能在一些高级语言中工作,但在汇编中,只有20个指令长代码有数百万种可能性,因此可能需要数年时间。而是专注于了解您期望的内容,这样您就可以轻松地将调试器的状态与您的期望进行比较,并发现任何差异。