Сложение чисел произвольной размерности - 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.

Объяснение кода листинга программы

  1. Объявлены две массивы чисел: num1 и num2, каждый из которых содержит четыре числа.
  2. Начальное значение переменной I равно 3, а конечное - 0.
  3. Процедура 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))).
  4. Цикл For I := 3 DownTo 0 Do применяет процедуру H к каждому элементу массива num1, выводит результат на экран и выполняет переход на метку lo.
  5. Цикл For I := 3 DownTo 0 Do применяет процедуру H к каждому элементу массива num2, выводит результат на экран.
  6. В блоке 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 - выполняет переход на начало цикла, если флаг переноса равен нулю.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы