如何修复“错误:无法生成 COM 文件,存在堆栈段”?

Dav*_*ngo 0 assembly compiler-errors dos tasm x86-16

我一直试图修复我的代码一段时间,但我似乎无法让它工作。它总是告诉我错误:无法生成 COM 文件,存在堆栈段。有什么想法可以解决这个问题吗?

这是我的代码:

.model small
.386
.stack 100h
.data
     inpM db "Input string: $"
     input db 19              ; max allowed 20
              db ?                ; # char entered
              db 19 dup(0)   ; chars entered
     output db 19 dup("$")
.code
start:    mov ax, @data
            mov ds, ax

            mov ah, 9              ; print inpM
            lea dx, inpM
            int 21h

            mov ah, 0Ah         ; get input
            lea si, input
            mov dx, si
            int 21h

            mov cl, [si+1]        ; reverse
            mov ch, 0
            add si, cx
            inc si
            lea di, output

rev:      mov al, [si]
            mov [di], al
            dec si
            inc di
            loop rev

again:  mov ah, 6         ; clrscr
            mov al, 0
            mov cl, 0
            mov ch, 0
            mov dl, 4Fh
            mov dh, 18h
           mov bh, 0Fh
           int 10h

          mov ah, 0
          mov bh, 0
          mov dl, 27h            ; column
          mov dh, 0               ; row

          mov ah, 9               ; print output
          lea dx, output
          int 21h

          mov bx, 20000       ; delay
l1:       mov cx, 0Fh

l2:      dec bx
          loop l2
          jnz l1

          add dh, 1                ; adds 1 to row

          loop again

          mov ah, 4Ch
          int 21h
end start
Run Code Online (Sandbox Code Playgroud)

附加信息:我的代码反转字符串输入,然后延迟显示在行中。希望找出错误的原因以及如何修复它。

Mic*_*tch 5

我从错误中假设您使用 TASM 和 TLINK 将其构建为 .COM 程序而不是 EXE。您需要注意的事项:

  • COM 程序应该使用tiny模型,而不是small.
  • COM 程序需要在您启动该.code段后以 100 小时的 ORG 开始。
  • COM 程序中的堆栈从代码运行所在段的顶部开始,因此需要删除堆栈大小的设置。
  • 您不再需要像构建 EXE 文件那样设置 DS,因为 CS=DS=ES=SS 与 COM 程序。

考虑到这些因素,您可以将代码的顶部修改为如下所示:

.model tiny
.386
.data
     inpM db "Input string: $"
     input db 19              ; max allowed 20
              db ?                ; # char entered
              db 19 dup(0)   ; chars entered
     output db 19 dup("$")
.code
org 100h
start:
        mov ah, 9              ; print inpM
        lea dx, inpM
        int 21h

        ...
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令构建它:

tasm myprg.asm
tlink /t myprg.obj
Run Code Online (Sandbox Code Playgroud)