Операции с массивами, встроенный в Borland Pascal ассемблер - Assembler
Формулировка задачи:
Помогите, пожалуйста перевести данную задачу на встроенный ассемблер. Даны два массива типа BYTE: один заполнен (средствами языка Паскаль) случайными числами в пределах от 1 до 10, другой заполнен нулями. Разработать про-грамму, записывающую во второй массив квадраты соответствующих чисел из пер-вого. Пример входных данных: A=(3, 1, 5, 7, 9), B=(0,0,0,0,0). Результат: B=(9, 1, 25, 49, 81). Примечание: использовать команду MUL.
Сама задача на паскале выглядит примерно так:
но вот как работать с двумя массивами во встроенном в TURBO PASCAL ассемблере я не знаю, помогите, кто разбирается в ассемблере, пожалуйста.
const a: array [1..5] of byte = (1,2,3,4,5); b: array [1..5] of byte = (0,0,0,0,0); var i: integer; begin for i:=1 to 5 do begin b[i]:=sqr(a[i]); write(b[i],' '); end; readln; end.
Решение задачи: «Операции с массивами, встроенный в Borland Pascal ассемблер»
textual
Листинг программы
const a: array [1..5] of byte = (1,2,3,4,5); b: array [1..5] of byte = (0,0,0,0,0); var i: integer; begin asm mov cx, 5 {sizeof(a)} lea si, a lea di, b @l: lodsb imul al stosb loop @l end; for i:=1 to 5 do write(b[i],' '); readln; end.
Объяснение кода листинга программы
- Объявляются два массива: a и b, первый содержит числа от 1 до 5, а второй - нули.
- Создается переменная i типа integer.
- В блоке asm происходит следующая последовательность действий:
- Переменная cx получает значение 5, что является размером массива a в байтах.
- si указывает на первый элемент массива a, а di - на первый элемент массива b.
- Происходит загрузка байта из массива a в al.
- Производится умножение al на imul.
- Записывается байт из al в массив b с помощью stosb.
- Происходит переход к следующей итерации цикла с помощью loop @l.
- В блоке for происходит вывод элементов массива b на экран через пробел.
- Программа ожидает ввода с помощью readln.
- Код завершается.