2016-04-21 192 views
2

我試圖做一個練習,我必須在20個元素向量中寫入斐波那契數列的前20個數字,但我不明白爲什麼代碼無法正常工作。它適用於該系列的前10個元素,但後來出現了一些我無法識別的問題。你怎麼看?這是我寫的代碼:EMU8086有錯誤,或者我寫錯了這個代碼?

DIM EQU 20 
COUNT EQU 18 
.model small 
.stack 
.data 

vect dw DIM dup ? 

.code 
.startup 

mov ax,1 
mov bx,1 
mov cx,COUNT 

lea si,vect 

mov [si],1 
add si,2 

ciclo: mov [si],bx 
     mov dx,bx 
     add bx,ax 
     mov ax,dx 
     add si,2 
     LOOP ciclo 

.exit 
end 

UPDATE

我沒有代碼,正是因爲它出現在我的程序粘貼。我正在運行的程序開始於:

ORG 100h 

我不認爲這很重要,所以我把它排除了。是不是重要?

以下是我在調試我的原始代碼時看到的內容。我步到ciclo: mov [si],bxCX有8個。

enter image description here

當我單步,則程序退出,它說PROGRAM HAS RETURNED CONTROL TO THE OPERATING SYSTEM如本圖片:

enter image description here

這究竟是爲什麼?

+4

請提供更詳細的問題描述,而不是_「存在一些我無法識別的問題」_。 – Michael

+1

你的模擬器沒有問題。 –

+0

是的,這是一個複製/粘貼錯誤。關於「mov [si],1」這一行,如果我沒有錯,英特爾使用little endian,指定1的大小更正確,但並不重要。無論如何感謝你的幫助,現在我要發佈兩個截圖,因爲我在調試過程中發現了一些奇怪的東西。如果你仍然想幫助我,我將不勝感激。 – Pecho

回答

0

我在EMU8086中測試了你的代碼,發現兩個小錯誤:在code之前的點,並初始化數據段。這裏是你的代碼固定:

DIM EQU 20 
COUNT EQU 18 
.model small 
.stack 
.data 

vect dw DIM dup ? 

.code       ;<================================= 
.startup 
mov ax, @data     ;<================================= 
mov ds, ax      ;<================================= 

mov ax,1 
mov bx,1 
mov cx,COUNT 

lea si,vect 

mov [si],1 
add si,2 

ciclo: mov [si],bx 
     mov dx,bx 
     add bx,ax 
     mov ax,dx 
     add si,2 
     LOOP ciclo 

.exit 
end 

下一頁截圖證明,與修復程序的偉大工程(見右下角的斐波那契數?):

enter image description here

+0

我不同意你的修補程序做了任何事情(除了丟失期間)。 '.startup'指令將發出適當設置_DS_的代碼。 –

+0

@MichaelPetch,在我的EMU8086中它不會發生,我必須添加這兩行來使其工作。 –

+0

你使用的是什麼版本?在4.08上'.startup'通過_DX_寄存器產生一個'mov'到'ds'。可能一些舊版本不能正確執行此操作。 –

3

之所以代碼是因爲你的原代碼有這個在頂端:

ORG 100h 

在EMU8086這有副作用,創建你的程序作爲DOS COM程序(不是DOS EXE程序)。使用COM程序 - 如果您在代碼之前放置數據,它將直接開始執行您的DATA代碼。在你的情況下,它開始在你的vect數組中執行垃圾,然後嘗試(不成功)運行你的實際代碼。這是您的程序在運行時以及通過EMU8086進行調試時出現的所有奇怪行爲的原因。

既然你明確有一個數據區,並且棧只是從頂部刪除org 100h,這將允許EMU8086作爲DOS EXE而不是DOS COM程序來執行你的代碼。


如果你想創建一個DOS COM程序,那麼你就需要刪除.stack指令。在最後一個可執行代碼段後面移動data段,在這種情況下,這是由.exit創建的代碼。這確保當DOS在頂部啓動程序時,DATA不會作爲代碼執行。這對於EMU8086中的DOS EXE程序不是問題。

DIM EQU 20 
COUNT EQU 18 

org 100h    ; COM programs are placed 256 from beginning of 
        ; of segment so we need ORG 100h. This 
        ; also informs EMU8086 you want to make a COM program 
        ; and not an EXE program. 

        ; No Stack specified for a COM program as DOS 
        ; automatically places it at the top of the 64K segment 
        ; and grows downward toward the code and data. 

.model tiny   ; Normally COM programs are TINY model (CS=DS=SS) 

.code 
.startup    ; This isn't needed for COM programs but won't hurt. 

mov ax,1 
mov bx,1 
mov cx,COUNT 

lea si,vect 

mov word ptr [si],1 ; To avoid a bug we want to update the WORD at [si] 
        ; not the BYTE. 
add si,2 


ciclo: mov [si],bx 
     mov dx,bx 
     add bx,ax 
     mov ax,dx 
     add si,2 
     LOOP ciclo 
     .exit  ; Program exits here 

.data    ; Place the data after the code for a COM program 

vect dw DIM dup ? 

end 
相關問題