使用嵌套循环乘法 Table

Multiplication Table using Nested Loops

汇编 x86 MASM

我创建了以下代码,将打印出乘以 1*1、1*2、1*3、...、1*10 的乘法 table。我想创建一个连续的 table of 1*1, 1*2, 1*3, ..., 1*10,以及另一个 table of 2*1, 2*2, 2* 3,...,2*10 和 3*1, 3*2, 3*3,...,3*10 等等直到 10*10 使用循环而不是分别写出每个过程。但是,我在创建循环时遇到困难。请任何人都可以告诉我。非常感谢你。

INCLUDE Irvine32.inc
.data
  a dword 1
  b dword 1
  z dword ?
  times byte " * ",0
  equals byte " = ",0
.code
main PROC
        call clrscr
        mov ecx,10
        outloop :
         push ecx
         call printtimes

         call crlf
         inc a
         pop ecx
        loop outloop

        call crlf 

        mov ecx,10
        mov a, 1
        outloop1 :
        push ecx 
        call printtimes1 

        call crlf 
        inc a 
        pop ecx 
        loop outloop1 

        call crlf 

        mov ecx,10
        mov a, 1
        outloop2 :
        push ecx 
        call printtimes2 

        call crlf 
        inc a 
        pop ecx 
        loop outloop2 


        exit

main ENDP



    mymul proc
        mov ecx,a
        mov eax,0
        myloop:
         add eax,b
        loop myloop
        mov z,eax

        ret
    mymul endp



    mymul1 proc

        mov ecx,a
        mov eax,0
        mov b, 1
        inc b
        myloop:
         add eax,b
        loop myloop
        mov z,eax

        ret
    mymul1 endp


    mymul2 proc

        mov ecx,a
        mov eax,0
        mov b, 2
        inc b
        myloop:
         add eax,b
        loop myloop
        mov z,eax

        ret
    mymul2 endp




    printtimes proc

      call mymul
        mov eax,a
        call writedec
        mov edx, offset times
        call writestring
        mov eax,b
        call writedec
        mov edx,offset equals
        call writestring
        mov eax,z
        call writedec
        call crlf
        ret 
     printtimes endp

         printtimes1 proc
      call mymul1
        mov eax,a
        call writedec
        mov edx, offset times
        call writestring
        mov eax,b
        call writedec
        mov edx,offset equals
        call writestring
        mov eax,z
        call writedec
        call crlf
        ret 
     printtimes1 endp

     printtimes2 proc
      call mymul2
        mov eax,a
        call writedec
        mov edx, offset times
        call writestring
        mov eax,b
        call writedec
        mov edx,offset equals
        call writestring
        mov eax,z
        call writedec
        call crlf
        ret 
     printtimes2 endp

end main

结果是(我希望使用嵌套循环来代替这个结果,但我很难创建它):

1*1=1 
2*1=2 
3*1=3 
4*1=4 
5*1=5
6*1=6 
7*1=7 
8*1=8 
9*1=9 
10*1=10 

1*2=2 
2*2=4 
3*2=6 
4*2=8 
5*2=10
6*2=12 
7*2=14 
8*2=16 
9*2=18 
10*2=20 


1*3=3 
2*3=6 
3*3=9 
4*3=12 
5*3=15
6*3=18 
7*3=21 
8*3=24 
9*3=27 
10*3=30 
   mov ecx,10
outloop :
    push ecx
    call printtimes
    call crlf
    inc a
    pop ecx
    loop outloop
    call crlf

以上是您生成第一个table (1*1=1 2*1=2 ... 10*1=10)
的代码 要开始使用 嵌套循环 来输出所有 table,您需要用一个额外的循环包围此代码,该循环将

  • a 变量重置为 1
  • 增加 b 变量

你一直重复这个额外的(外部)循环,直到 b 变量变得大于 10。
为了简化,您可以在内部循环中不使用 ECX 寄存器,同时注意 a 变量的值变得大于 10。

    mov     b, 1
OuterLoop:
    mov     a, 1
InnerLoop:
    call    printtimes
    call    crlf
    inc     a
    cmp     a, 10
    jbe     InnerLoop
    call    crlf
    inc     b
    cmp     b, 10
    jbe     OuterLoop

您不再需要 printtimes1printtimes2mymul1mymul2 在你的程序中。