繁体   English   中英

在汇编 x86 中打印多位数的三角形

[英]Print triangle of multidigit number in assembly x86

我必须做 o 读取 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

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

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

将这些“新行”序列移动到单独的过程中,因此您可以call newline而不是那 6 行,这样可以更轻松地阅读源代码,而且您可以使用push/pop将它们包裹起来以保留寄存器值。

为什么ah=8, int 21h input char,什么时候再输出呢? 然后您可以使用ah=1 "with echo" 输入。

add bx,30h
call function

^^ 再次,如果bx是像15这样的数值,则在转换为 ASCII 之前向其添加'0'没有意义。 它将把15变成63 ,并显示"63" (如果你的“ function ”是正确的——它不是)。

call function后的int 21h做什么?

function:不会返回。

function:就像参数在ax ,但是我猜主代码是用bx调用它的……尽管如此, bx内容将被破坏,而主代码不希望这样。

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

暂无
暂无

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

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