Таблица умножения с использованием вложенных циклов
Сборка 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
1 ответ
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
)
Чтобы начать использовать вложенные циклы для вывода всех таблиц, вам нужно окружить этот код дополнительным циклом, который будет
- сбросить переменную до 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
Вам больше не нужны printtimes1, printtimes2, mymul1 и mymul2 в вашей программе.