8086彙編 輸出斐波那契數列(值小於1000)

寫的比較麻煩,因爲把存放斐波那契數列的內存單元劃分的正正好

其實真正應該是寫個判斷數<1000,然後邊計算邊輸出最好

但是因爲我覺得斐波那契前幾項數是常識- -直接想了最好一項987是17項,就預留了20個字節單元

隨意看看吧,代碼太繁瑣了,有時間再寫個版本吧



data segment

db 20 dup(0);第15項是377,前14項都小於255,最大的小於1000的數是987是第17項,所以預留20個字節單元
input db 'the fibonacci Sequence (under 1000) is:',0ah,0dh,'$'
data ends

stack segment
db 20 dup(0)
stack ends

code segment
assume cs:code,ds:data,ss:stack
;程序開始
begin:
mov ax,data
mov ds,ax
lea dx,input;提示語句操作
mov ah,9;調用21中斷的9號功能
int 21h

xor dx,dx;dx清零
xor ax,ax;ax清零
mov cx,12;只要循環12次
mov bx,0;用bx存放前面一項a(n-1)
mov dx,1;用dx存放後面一項a(n)
mov si,0;ds:si指向表的第一個字節單元
mov [si],bx;存放初始的0,1兩項
mov [si+1],dx
mov si,2;ds:si指向表的第三個字節單元

sequence:;存放前面14項,只需要字節單元來存儲,循環12次,不是14次,因爲前面兩項已經放進去了
push dx
add dx,bx
pop bx
mov [si],dx
inc si
loop sequence

mov cx,3;最後三項需要用字單元來存放

sequence2:
push dx
add dx,bx
pop bx
mov word ptr [si],dx
add si,2;指向下一個字單元
loop sequence2

inputttt proc;過程名後面並沒有用到只是爲了方便我自己看

;轉化爲10進制輸出
mov si,18;需要從最後一項開始入棧,爲了使輸出的數列順序正確
mov bx,10;設置除數


mov cx,3;比255大的3項,設置循環次數爲3

abov255:
mov ax,word ptr [si]
mov dx,0;***之前這裏忘了餘數清零,出現了divide error的錯誤,需注意***
div bx
push dx
mov dx,0
div bx
push dx
mov dx,0
div bx
push dx
mov ax,(20h-30h);存入空格,本來準備存逗號,這樣最後一個數後面就會多一個逗號,如果不把最後一個數從循環裏拿出來的話,看着很不好
push ax
sub si,2;ds:si指向上一個字單元
loop abov255

inc si;注意,因爲是倒着過來減的,前面的是字單元,所以這裏容易忘了si要加1,轉變爲字節單元
mov cx,2;比100大的但是比255小的有兩項
be255:
mov al, [si];大致操作與上面相同- -所以不自習註釋了,就是傳送的時候不是字節單元是字單元
mov ah,0
mov dx,0;
div bx
push dx
mov dx,0
div bx
push dx
mov dx,0
div bx
push dx
mov dx,0
mov ax,(20h-30h)
push ax
dec si
loop be255


mov cx,5;比100小的有5項


be100:
mov al,[si];操作與上面差不多就是少了一位,少除1次
mov ah,0
mov dx,0
div bx
push dx
mov dx,0
div bx
push dx
mov ax,(20h-30h)
push ax
mov ax,0
dec si
loop be100

mov cx,7;比10小的有七項


bel10:;比10小的數十進制位數只有一位,不用除直接入棧就好
mov al,[si]
mov ah,0
push ax;餘數入棧
mov ax,(20h-30h);存入空格,後面需要加上30h所以這裏減去20h
push ax
dec si
loop bel10

;出棧,開始輸出數列
mov cx,49
xor dx,dx
inb10:
pop dx
add dl,30h;轉化爲編碼
mov ah,2;調用2號功能輸出
int 21h
loop inb10
inputttt endp;輸出過程結束
 
mov ax,4c00h;程序結束
int 21h
code ends
end begin
;下面是一個本來準備調用的子程序- -結果用不到了
;oturntod:
;push ax
;push bx
;push cx
;push dx
;mov bx,10
;xor cx,cx
;a:
;xor dx,dx
;div bx
;push dx;餘數入棧
;inc cx;用cx計數需要除10的次數,數有幾位
;cmp ax,0;商是否爲0
;jnz a
;loop a
;pop dx
;pop cx
;pop bx
;pop ax



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章