汇编语言中,为什么定义堆栈段的时候后面要多加一个stack 如:stack segment s

汇编语言中,为什么定义堆栈段的时候后面要多加一个stack 如:stack segment stack
定义数据段的时候不加如data segment

定义堆栈段的时候,比较特殊,如果在后面加上 stack 指明定义堆栈段,就自动对ss,sp进行了赋值------否则只是一个普通的段,如果要使用它,就需要在代码中对ss,sp赋值。
这个需要看编译环境,用masm for windows这个软件时,可以不加。但是如果用debug运行时,可能会出错,提示没有定义堆栈段。
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-04-14
assume cs:code,ss:stack,ds:data ; 段说明, 自己定义的code对应代码段, stack对应堆栈段, data对应数据段

stack segment stack ; 堆栈段的定义
byte 64 dup(0)
stack ends

data segment ; 数据段的定义
msg byte 'hello world!$'
data ends

code segment ; 代码段的定义
start:
mov ax,data
mov ds,ax
mov dx,offset msg
mov ah,9
int 21h
mov ax,4c00h
int 21h
code ends
end start
;=============以上是一个常见的定义=============
masm 5.0 以后也支持简化定义如 .data 为数据段 .code表示代码段, 形式如下:
.model small
.stack 200h ; 定义堆栈段大小
.data ; 定义数据段
szMsg db 'Hello World!',13,10,'$'

.CODE ; 代码段的定义
START:
mov ax,@data
mov ds,ax
mov es,ax
mov si,0
mov es:[bx+1+si],ah
lea dx,szMsg
mov ah,9
int 21h

;暂停,任意键关闭
mov ah,1
int 21h
mov ah,4ch ;结束,可以修改al设置返回码
int 21h

END START本回答被网友采纳
第2个回答  2019-01-06
在程序没有定义堆栈段的情况下,在由连接程序生成执行文件时,将会产生一条warning no stack segment的警告信息, 当然你不必理会它,所生成的执行文件是可以正常运行的。这是因为:如果在程序中不定义堆栈段,那么,操作系统在装入该执行程序时将自动为其指定一个64K字节的堆栈段,所以你没申明堆栈当然也可以用PUSH/POP。
操作系统在把应用程序装入内存时,默认分配堆栈段与代码段同段,应用程序可以自行设置自己的堆栈段。自行设置的堆栈段大小最小4个字节(只够PUSH/POP CS、IP),用于从应用程序返回操作系统。只有较大的程序或递归调用较深的程序,才有必要设置独立 的堆栈段;在程序中可以定义它,也可以不定义。一个完整的源程序(尤其是PUSH/POP 操作特别多,比如有递归的时候)一般最好定义堆栈段。
HITWH LEVI
相似回答