回 帖 发 新 帖 刷新版面

主题:大哥大姐们看看这是什么原因

代码编绎能通过,但每次连接就出现下面这些:
Microsoft (R) Overlay Linker  Version 3.65
Copyright (C) Microsoft Corp 1983-1988.  All rights reserved.

Run File [TELIST.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment
TELIST.OBJ(telist.asm) : fatal error L1103: attempt to access data outside segme
nt bounds
pos: 1BC Record type: 4B1A

什么意思啊!
代码如下:

data segment
inbuf label byte
maxlen db 20
len db ?
buffer db 20 dup(' ')
outname db 20 dup(' '),'$'
outphone db 8 dup(' '),'$'
msg1 db 'input name:$'
msg2 db 'input a telephone number:$'
form db 'name',16 dup(20h),'tel','$'
data ends

;data segment ends
code segment
begin proc far  ;inital

assume cs:code,ds:data
start:             
      mov ax,data
      mov ds,ax
      mov es,ax
      
      mov ah,09h             ;get name
      lea dx,msg1
      int 21h
      call input_name
      
      mov ah,09h             ;get phone number
      lea dx,msg2
      int 21h
      call inphone
      
      call printline
      mov ax,4c00h
      int 21h
   begin endp




getchar proc near             ;get the string input
    mov ah,0ah
    lea dx,inbuf
    int 21h
    ret
getchar endp


input_name proc near           ;store name
    call getchar
    mov cx,20
    cld
    lea si,buffer
    lea di,outname
    rep movsb
    ret
input_name endp

inphone proc near             ;store phonenum
   call getchar
   mov cx,8
   cld
   lea si,buffer
   lea di,outphone
   rep movsb
   ret
inphone endp  

printline proc near           ;show the name and phonenum
    mov ah,09h
    lea dx,form
    int 21h
    
    mov dl,0dh             ;change the line
    mov ah,2
    int 21h
    mov dl,0ah
    int 21h
    
    mov ah,09h
    lea dx,outname
    int 21h
    
    mov ah,09h
    lea dx,outphone
    int 21h
  ret
printline endp


end start


帮到看哈子,感谢不尽!!

回复列表 (共5个回复)

沙发



STACK   SEGMENT STACK  'STACK'
        DB      64    DUP (?)
STACK   ENDS

data segment
inbuf label byte
maxlen db 20
len db ?
buffer db 20 dup(' ')
outname db 20 dup(' '),'$'
outphone db 8 dup(' '),'$'
msg1 db 'input name:$'
msg2 db 'input a telephone number:$'
form db 'name',16 dup(20h),'tel','$'
data ends

;data segment ends
code segment

begin proc far  ;inital
    assume cs:code,ds:data
start:             
      mov ax,data
      mov ds,ax
      mov es,ax
      
      mov ah,09h             ;get name
      lea dx,msg1
      int 21h
      call input_name
      
      mov ah,09h             ;get phone number
      lea dx,msg2
      int 21h
      call inphone
      
      call printline
      mov ax,4c00h
      int 21h
begin endp

getchar proc near             ;get the string input
    mov ah,0ah
    lea dx,inbuf
    int 21h
    ret
getchar endp

input_name proc near           ;store name
    call getchar
    mov cx,20
    cld
    lea si,buffer
    lea di,outname
    rep movsb
    ret
input_name endp

inphone proc near             ;store phonenum
   call getchar
   mov cx,8
   cld
   lea si,buffer
   lea di,outphone
   rep movsb
   ret
inphone endp  

printline proc near           ;show the name and phonenum
    mov ah,09h
    lea dx,form
    int 21h
    
    mov dl,0dh             ;change the line
    mov ah,2
    int 21h
    mov dl,0ah
    int 21h
    
    mov ah,09h
    lea dx,outname
    int 21h
    
    mov ah,09h
    lea dx,outphone
    int 21h
  ret
printline endp
code    ends
        end        begin

板凳

修改后可以通过编译连接

3 楼

首先很谢谢你!

但是我按照你说的加了那个段还是编绎不过去列,
错误还是这,你让我加个堆栈段上去,但是我们课本上好多程序都不用堆栈段呀!
也可以编绎列
Run File [TELIST.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
TELIST.OBJ(telist.asm) : fatal error L1103: attempt to access data outside segme
nt bounds
pos: 1CC Record type: 4B16

4 楼

我不光加了一个段,你仔细对照一下
对于不是 tiny 类型的程序,不加 stack 段可不是好习惯
如果 push 和 pop 操作,有可能发生溢出(因为 sp, ss 不知直到哪里)

5 楼

找到了,嘿嘿!
多谢指导!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册