2016-10-30 10 views
4

Сборка x86 MASMТаблица умножения с использованием вложенных циклов

Я создал следующий код, который будет печатает таблицу умножения, которая умножает 1 * 1, 1 * 2, 1 * 3, ..., 1 * 10. Я хочу создать непрерывную таблицу 1 * 1, 1 * 2, 1 * 3, ..., 1 * 10 и другую таблицу 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 
+3

Это то, что '; 1 * 30 = 30' материал в конце должен быть выходом? Я не понимаю, в чем проблема. Объясните, в какой части вы застряли, выясняя, как написать программу, которая добавляет и печатает в цикле для создания таблиц умножения. Все это звучит для меня довольно просто, поэтому IDK какая часть вам не очевидна. –

+1

Я до сих пор не понимаю, почему это было бы трудно, или с какой частью у вас проблемы. У вас закончились регистры для счетчика внешнего контура? Вам просто нужно напечатать 'j * i = prod' в цикле' for (i = 1..10) для (j = 1..10) '. У вас, видимо, уже есть целые числа печати, так как вы печатаете '10' ok (не попадаете в проблему с многозначными целыми числами, которые не работают с просто« add al », 0''). –

+0

Можете ли вы показать мне псевдокод? Большое вам спасибо –

ответ

2
mov ecx,10 
outloop : 
    push ecx 
    call printtimes 
    call crlf 
    inc a 
    pop ecx 
    loop outloop 
    call crlf 

Все предыдущие ваш код, чтобы произвести 1-й стол (1*1=1 2*1=2 ... 10*1=10)
Чтобы начать использовать вложенные петли для вывода всех t он таблица, вы должны окружить этот код дополнительного циклом, который будет

  • сбросом переменных на 1
  • увеличивает б переменной

Вы продолжаете повторять эту дополнительный (внешняя) до b переменная стала больше 10.
Для упрощения вы можете отклонить использование регистрадля внутреннего цикла, и als о следите за значением переменной становится больше 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 

Вам больше не нужно printtimes1, printtimes2, mymul1 и mymul2 в вашей программе.