Числа Фибоначчи - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д