2

我试图做一个练习,我必须在 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],bxCX里面有8个。

在此处输入图像描述

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

在此处输入图像描述

为什么会这样?

4

2 回答 2

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
于 2016-04-21T17:17:37.467 回答
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

下一个屏幕截图证明,通过修复程序运行良好(见右下角的斐波那契数字?):

在此处输入图像描述

于 2016-04-21T15:24:12.873 回答