Числа Фибоначчи - Assembler (223005)

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

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

Не могу понять почему не работает правильно этот код
Листинг программы
  1. .686
  2. .model flat,stdcall
  3. option casemap:none
  4. include \masm32\include\windows.inc
  5. include \masm32\include\user32.inc
  6. include \masm32\include\kernel32.inc
  7. include \masm32\include\masm32.inc
  8. includelib \masm32\lib\user32.lib
  9. includelib \masm32\lib\masm32.lib
  10. includelib \masm32\lib\kernel32.lib
  11. .data
  12. message db "5",0;
  13. mestitle db "вывод ",0
  14. buffer db 128 dup (0)
  15. format db "%d",0
  16. .code
  17. start:
  18. ; эта часть (начало)
  19. mov cx,7
  20. mov ax,1
  21. mov bx,1
  22. mov dx,0
  23. a_1:
  24. add dx,ax
  25. add dx,bx
  26. mov ax,bx
  27. mov bx,dx
  28. loop a_1
  29. ;(конец)
  30. invoke wsprintf, addr buffer,addr format,dx
  31. invoke MessageBox,0,addr buffer,addr mestitle,MB_OK
  32. invoke ExitProcess,0
  33. end start
Хотя схожий код работает на высокоуровневых языках программирования rust и python 3. Да ассемблер это не высокоуровневый язык, но алгоритм в чём-то схож. rust:
Листинг программы
  1. use std::io;
  2. fn main(){
  3. let mut a=1;
  4. let mut b=1;
  5. let mut s=0;
  6. for i in 0..12{
  7. s=a+b;
  8. a=b;
  9. b=s;
  10. println!("{}",s)
  11. }
  12. let mut xxx=String::new();
  13. io::stdin().read_line(&mut xxx).expect("Error");
  14. let xxx:i32=xxx.trim().parse().expect("ERROR");
  15. }
python3
Листинг программы
  1. a=1
  2. b=1
  3. w=0
  4. for i in range(0,12):
  5. w=a+b
  6. a=b
  7. b=w
  8. print(w)

Решение задачи: «Числа Фибоначчи»

textual
Листинг программы
  1. org     100h
  2.         mov     ax,1
  3.         mov     bx,1
  4.         mov     di,10
  5.         mov     cx,7
  6. @@01:   call    OutNum
  7.         add     ax,bx
  8.         push    ax
  9.         push    bx
  10.         pop     ax
  11.         pop     bx
  12.         loop    @@01
  13.         xor     ax,ax
  14.         int     16h
  15.         ret
  16. OutNum: push    ax
  17.         push    cx
  18.         xor     cx,cx
  19. @@02:   xor     dx,dx
  20.         div     di
  21.         push    dx
  22.         inc     cx
  23.         or      ax,ax
  24.         jnz     @@02
  25.         mov     al,' '-'0'
  26.         push    ax
  27.         inc     cx
  28. @@03:   pop     ax
  29.         add     al,'0'
  30.         int    29h
  31.         loop    @@03
  32.         pop     cx
  33.         pop     ax
  34.         ret

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

В представленном коде выполняется следующее:

  1. Объявление точки входа в программу с адресом 100h.
  2. Присваивание значения 1 регистру AX.
  3. Присваивание значения 1 регистру BX.
  4. Присваивание значения 10 регистру DI.
  5. Присваивание значения 7 регистру CX.
  6. Начало цикла с меткой @@01.
  7. Вызов процедуры OutNum для вывода числа на экран.
  8. Суммирование значений в регистрах AX и BX и сохранение результата в AX.
  9. Помещение значений регистров AX и BX в стек.
  10. Извлечение значений из стека в обратном порядке в регистры AX и BX.
  11. Уменьшение значения регистра CX на 1 при помощи команды LOOP.
  12. Повторение шагов с 7 по 11, пока значение регистра CX не достигнет нуля.
  13. Обнуление значения регистра AX при помощи команды XOR.
  14. Выполнение прерывания 16h для завершения программы.
  15. Возврат из процедуры OutNum.
  16. Процедура OutNum: сохранение значения регистра AX в стеке.
  17. Сохранение значения регистра CX в стеке.
  18. Обнуление значения регистра CX при помощи команды XOR.
  19. Внутренний цикл с меткой @@02.
  20. Обнуление значения регистра DX при помощи команды XOR.
  21. Деление значения регистра AX на значение регистра DI с сохранением остатка в регистре DX.
  22. Сохранение значения регистра DX в стеке.
  23. Увеличение значения регистра CX на 1.
  24. Проверка значения регистра AX на ноль. Если ноль, то переход на метку @@02.
  25. Преобразование значения регистра AL в символ при помощи сложения с кодом символа '0'.
  26. Вывод символа с помощью прерывания 29h.
  27. Повторение шагов с 22 по 26, пока значение регистра CX не достигнет нуля.
  28. Извлечение значения регистра CX из стека.
  29. Извлечение значения регистра AX из стека.
  30. Возврат из процедуры OutNum.

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


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

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

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы