我尝试做一个练习,我必须用20个元素向前写20个斐波那契数列,但我无法理解为什么代码不能正常工作。它适用于该系列的前10个元素,但随后出现了一些我无法识别的问题。你怎么看?这是我写的代码:
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
更新
我没有完全按照我的程序中显示的方式粘贴代码。我正在运行的程序以:
开头ORG 100h
我认为这很重要,所以我把它排除在外。这很重要吗?
这是我在调试原始代码时看到的内容。我走到ciclo: mov [si],bx
。 CX 中有8个。
当我单步退出程序然后退出并显示PROGRAM HAS RETURNED CONTROL TO THE OPERATING SYSTEM
时,如下图所示:
为什么会这样?
答案 0 :(得分: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
答案 1 :(得分: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
下一个截图证明,通过修复,程序运行良好(参见右下方的Fibonacci数字?):