Сложение чисел произвольной размерности - Assembler
Формулировка задачи:
3. Написать программу, производящую сложение чисел произвольной размерности. Числа хранятся в виде массивов типа longint, где 0-й элемент массива - содержит младшие 32 бита числа (с 0-го по 31-й), следующий элемент массива с 32-го по 63-й и т. д. Ввод-вывод данных чисел осуществлять в 16-ричной системе счисления.
Решение задачи: «Сложение чисел произвольной размерности»
textual
Листинг программы
Const num1 : Array [0..3] Of Word = ( $1234, $5678, $9012, $3456 ) ; num2 : Array [0..3] Of Word = ( $1234, $5678, $9012, $3456 ) ; Label lo ; Var I : Integer ; Procedure H(W : Word) ; Var I : Integer ; B : Byte ; Begin For I := 3 DownTo 0 Do Begin B := ((W SHR (4*I)) And $F) + $30 ; If B > $39 Then B := B + 7 ; Write(Chr(B)) End End ; Begin For I := 3 DownTo 0 Do H(num1[I]) ; WriteLn ; For I := 3 DownTo 0 Do H(num2[I]) ; WriteLn ; Asm lea si, num1 lea di, num2 mov cx, 4 cld clc lo: lodsw adc [di], ax inc di inc di loop lo End ; For I := 3 DownTo 0 Do H(num2[I]) End.
Объяснение кода листинга программы
- Объявлены две массивы чисел: num1 и num2, каждый из которых содержит четыре числа.
- Начальное значение переменной I равно 3, а конечное - 0.
- Процедура H принимает на вход одно число (тип Word) и выполняет следующие действия: a. Получает младшие 4 бита числа (цикл For I := 3 DownTo 0 Do). b. Приводит полученные биты к типу Byte (B := ((W SHR (4*I)) And $F) + $30). c. Проверяет полученное значение Byte и добавляет 7, если оно больше $39 (If B > $39 Then B := B + 7). d. Выводит полученное значение на экран (Write(Chr(B))).
- Цикл For I := 3 DownTo 0 Do применяет процедуру H к каждому элементу массива num1, выводит результат на экран и выполняет переход на метку lo.
- Цикл For I := 3 DownTo 0 Do применяет процедуру H к каждому элементу массива num2, выводит результат на экран.
- В блоке Asm происходит следующее:
a. lea si, num1 - загружает в регистр si адрес массива num1.
b. lea di, num2 - загружает в регистр di адрес массива num2.
c. mov cx, 4 - устанавливает значение регистра cx равным 4.
d. cld - устанавливает направление переходов в цикле в прямом (от меньшего к большему).
e. clc - очищает флаг переноса.
f. loop - выполняет цикл, пока значение регистра cx больше нуля (цикл выполняется 4 раза).
- В каждой итерации цикла происходит следующее:
- lodsw - загружает в регистры ax и dx два байта из памяти по адресу, на который указывает di.
- adc [di], ax - складывает содержимое регистра ax с содержимым памяти по адресу, на который указывает di, и записывает результат обратно в память по этому же адресу.
- inc di - увеличивает значение регистра di на единицу.
- inc di - увеличивает значение регистра di на единицу.
- loop - выполняет переход на начало цикла, если флаг переноса равен нулю.
- В каждой итерации цикла происходит следующее:
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д