Проверка трёх введённых чисел на кратность 7 - Assembler
Формулировка задачи:
Здравствуйте. Помогите пожалуйста сократить программу, направьте в нужное русло
Задание: являются ли три введённые числа кратными семи
Текст:
Пытаюсь сделать через цикл, но не получается. Не знаю как заменить итерации на переменные a,b,c
var o,l,g:byte;
a,b,c:word;
begin
o:=0;
writeln ('vvedite a');
readln (a);
asm
mov ax,a
mov cl,7
div cl
test ah,ah
jnz @k
mov o,1
@k: nop
end;
writeln ('o=',o);
begin
l:=0;
writeln ('vvedite b');
readln (b);
asm
mov ax,b
mov cl,7
div cl
test ah,ah
jnz @k
mov l,1
@k:nop
end;
writeln ('l='l);
end;
begin
g:=0;
writeln ('vvedite c');
readln (c);
asm
mov ax,c
mov cl,7
div cl
test ah,ah
jnz @k
mov g,1
@k: nop
end;
writeln ('g='g);
end;
end.Решение задачи: «Проверка трёх введённых чисел на кратность 7»
textual
Листинг программы
var a:array [0..2] of word; begin readln(a[0],a[1],a[2]); asm lea si,a mov bx,7 mov cx,3 @Cycle: lodsw xor dx,dx div bx cmp dx,0 mov ah,2 mov dl,'N' jnz @No mov dl,'Y' @No: int 21h mov dl,' ' int 21h loop @Cycle end; readln; end.
Объяснение кода листинга программы
- Объявление переменной
aтипаarray [0..2] of word - Ввод трех чисел с помощью функции
readln(a[0],a[1],a[2]) - Начинается ассемблерный блок
- Переменная
siссылается на первый элемент массиваa - Переменная
bxсодержит число 7 - Переменная
cxсодержит число 3 - Начинается цикл
Cycle - Чтение двух байтов из массива
aв регистрdx - Регистр
dxделится на число 7 - Если результат деления равен нулю, то выполняется блок кода до инструкции
jnz @No - Если результат деления не равен нулю, то выполняется блок кода после инструкции
jnz @No - Вывод символа 'N' или 'Y' с помощью функции
int 21h - Вывод символа пробела с помощью функции
int 21h - Цикл повторяется до тех пор, пока не будет выполнено условие
jnz @Cycle - Код на ассемблере завершается
- Вывод символа 'N' или 'Y' с помощью функции
readln - Код на языке Pascal завершается
- Программа завершается