Числа Фибоначчи - Assembler (223005)
Формулировка задачи:
Не могу понять почему не работает правильно этот код
Хотя схожий код работает на высокоуровневых языках программирования rust и python 3.
Да ассемблер это не высокоуровневый язык, но алгоритм в чём-то схож.
rust:
python3
Листинг программы
- .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
Листинг программы
- 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");
- }
Листинг программы
- 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
Объяснение кода листинга программы
В представленном коде выполняется следующее:
- Объявление точки входа в программу с адресом 100h.
- Присваивание значения 1 регистру AX.
- Присваивание значения 1 регистру BX.
- Присваивание значения 10 регистру DI.
- Присваивание значения 7 регистру CX.
- Начало цикла с меткой @@01.
- Вызов процедуры OutNum для вывода числа на экран.
- Суммирование значений в регистрах AX и BX и сохранение результата в AX.
- Помещение значений регистров AX и BX в стек.
- Извлечение значений из стека в обратном порядке в регистры AX и BX.
- Уменьшение значения регистра CX на 1 при помощи команды LOOP.
- Повторение шагов с 7 по 11, пока значение регистра CX не достигнет нуля.
- Обнуление значения регистра AX при помощи команды XOR.
- Выполнение прерывания 16h для завершения программы.
- Возврат из процедуры OutNum.
- Процедура OutNum: сохранение значения регистра AX в стеке.
- Сохранение значения регистра CX в стеке.
- Обнуление значения регистра CX при помощи команды XOR.
- Внутренний цикл с меткой @@02.
- Обнуление значения регистра DX при помощи команды XOR.
- Деление значения регистра AX на значение регистра DI с сохранением остатка в регистре DX.
- Сохранение значения регистра DX в стеке.
- Увеличение значения регистра CX на 1.
- Проверка значения регистра AX на ноль. Если ноль, то переход на метку @@02.
- Преобразование значения регистра AL в символ при помощи сложения с кодом символа '0'.
- Вывод символа с помощью прерывания 29h.
- Повторение шагов с 22 по 26, пока значение регистра CX не достигнет нуля.
- Извлечение значения регистра CX из стека.
- Извлечение значения регистра AX из стека.
- Возврат из процедуры OutNum.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д