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
一段时间以来,我一直在尝试修复我的代码,但我似乎无法完成 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