EMU8086是否有错误,或者我在编写此代码时出错?

时间:2016-04-21 14:43:02

标签: assembly x86-16 emu8086

我尝试做一个练习,我必须用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个。

enter image description here

当我单步退出程序然后退出并显示PROGRAM HAS RETURNED CONTROL TO THE OPERATING SYSTEM时,如下图所示:

enter image description here

为什么会这样?

2 个答案:

答案 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数字?):

enter image description here