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

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

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

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

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

textual
Листинг программы
org     100h
        mov     ax,1
        mov     bx,1
        mov     di,10
        mov     cx,7
@@01:   call    OutNum
        add     ax,bx
        push    ax
        push    bx
        pop     ax
        pop     bx
        loop    @@01
        xor     ax,ax
        int     16h
        ret
OutNum: push    ax
        push    cx
        xor     cx,cx
@@02:   xor     dx,dx
        div     di
        push    dx
        inc     cx
        or      ax,ax
        jnz     @@02
        mov     al,' '-'0'
        push    ax
        inc     cx
@@03:   pop     ax
        add     al,'0'
        int    29h
        loop    @@03
        pop     cx
        pop     ax
        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
Похожие ответы