Числа Фибоначчи - 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 startuse 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.