How to fix "error:cannot generate COM file, stack segment present"?

How to fix "error:cannot generate COM file, stack segment present"?

一段时间以来,我一直在尝试修复我的代码,但我似乎无法完成 work.It 总是告诉我 error:cannot 生成 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

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

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

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

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

.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

        ...

然后您可以使用以下方法构建它:

tasm myprg.asm
tlink /t myprg.obj