Вычисление факториала - Assembler

Узнай цену своей работы

Формулировка задачи:

Привет всем!Помогите пожалуйста решить задачу: Составить фрагмент программы на языке Ассемблер, вычисляющий факториал заданного числа К (К – от 0 до 8). Результат записать в АХ. Заранее благодарен!!!

Решение задачи: «Вычисление факториала»

textual
Листинг программы
! sum(i=3->6) fact(i)
 
 
_EXIT    =  1
 
_PRINTF  =  127
 
 
.SECT.TEXT
 
 
 
start:
    
MOV BX,0
    
MOV SI,vec
    
MOV CX,output-vec
    
SHR CX,1
 
lp: 
    
PUSH (SI)
    
CALL fact
    
POP AX
    
ADD BX, AX
    
ADD SI,2
 
LOOP lp
    
MOV (result),BX
 
    
PUSH (result)
    
PUSH output
    
PUSH _PRINTF
    
SYS
    
ADD sp,6
 
    
PUSH 0
    
PUSH _EXIT
    
SYS
 
 
 
 
fact:
 
    
PUSH AX
    
PUSH CX
    
PUSH DX
    
PUSH BP
    
MOV BP,SP
 
 
    
MOV AX,10(BP)
    
MOV CX,AX
    
DEC CX
    
MOV DX,0
 
l1: 
    
MUL CX
 
LOOP l1
    
MOV 10(BP),AX
 
    
MOV SP,BP
    
POP BP
    
POP DX
    
POP CX
    
POP AX
 
 
RET
 
    
 
 
.SECT.DATA
    
vec:    .WORD   3,4,5,6
    
output: .ASCIZ "result = %d\n"
 
.SECT.BSS
    
result: .WORD 2

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

Выполняемый файл на ассемблере, который вы предоставили, вычисляет факториал чисел от 3 до 6 и выводит результат на консоль. Вот список действий, которые выполняет этот код:

  1. Инициализирует переменные BX и SI регистрами, которые используются для хранения индексов и значений из вектора.
  2. Инициализирует переменную CX значением, равным разнице между выходным файлом и вектором.
  3. Использует операцию сдвига на один раз вправо для CX, чтобы уменьшить его значение на единицу. Это продолжается до тех пор, пока CX не станет равным нулю.
  4. Когда CX становится равным нулю, выполняется выход из цикла и регистр BX обновляется значением AX.
  5. Затем регистры BX, SI, DX и BP очищаются и инициализируются для выполнения функции fact.
  6. Функция fact сначала инициализирует регистры BP, SP и AX.
  7. Затем она перемещает AX на 10-й элемент стека (BP).
  8. Она использует цикл для выполнения умножения для каждого элемента стека до тех пор, пока CX не станет равным нулю.
  9. После завершения цикла она перемещает результат на 10-й элемент стека (BP).
  10. Затем она очищает регистры BP, SP, DX, CX и AX и возвращает управление обратно в start.
  11. Функция main затем использует системный вызов для вывода строки result = x\n, где x — это факториал последнего числа в векторе.
  12. Наконец, программа завершается путем выполнения системного вызова exit.

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


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

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

15   голосов , оценка 3.933 из 5