汇编语言中,为什么定义堆栈段的时候后面要多加一个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

...段的时候后面要多加一个stack 如:stack segment s
定义堆栈段的时候,比较特殊,如果在后面加上 stack 指明定义堆栈段,就自动对ss,sp进行了赋值---否则只是一个普通的段,如果要使用它,就需要在代码中对ss,sp赋值。这个需要看编译环境,用masm for windows这个软件时,可以不加。但是如果用debug运行时,可能会出错,提示没有定义堆栈段。

汇编语言中 在堆栈段的定义里面 top equ $-stack 是什么意
估计你这个完整的定义是这样的:stack1 segment stack db 200htop equ $-stackstack1 ends通过 top equ $-stack 可以获得栈的大小(其实就是 200h,似乎多此一举),目的是要通过 mov sp,top 把这个栈顶的初始值传送到sp中。

汇编语言源程序的组成部分
1. 数据段(Data Segment):这部分包含了程序使用的静态数据,如初始化的变量和常量。2. 代码段(Code Segment):这部分包含了程序的执行代码,即CPU需要执行的指令。3. 堆栈段(Stack Segment):这部分用于实现程序的函数调用和返回。接下来,我们将详细解释这些部分。数据段是汇编语言源程序中用于存...

汇编stack segment stack指令是什么意思?
他是一个伪指令 用来定义一个堆栈段

汇编语言自己定义的堆栈
这样,XX 就跟堆栈段 SS 联系起来了,程序也就知道你定义的堆栈在哪了。下面给一个简单例子,将数据段data的内容逆序存放到堆栈段stack中 ASSUME CS:CODE, DS:DATA, SS:STACK DATA SEGMENT DW 1,2,3,4,5,6,7,8 DATA ENDS STACK SEGMENT DW 0,0,0,0,0,0,0,0 STACK ENDS CODE SEGMENT...

汇编语言的标号和变量有什么区别?
汇编语言中,变量和标号都是用户定义的符号地址,标号有两个属性,段基地址、偏移地址变量有三个属性,段基地址、偏移地址和数据类型一般来说,标号只在代码段中被定义,而变量则可以被定义在数据段和代码段中!计算机汇编语言的一个突出优点就是利用符号(Symbol)来代替目标码,也即大量的二进制代码用符号来表示,使汇编语...

能帮我解释汇编的语言每句是什么意思么??
程序共有5段组成,第一段是为整个程序定义堆栈段、数据段和代码段,第二三四段是代码段,无非是一些数据传递、算术运算、逻辑运算指令,最后一段结束程序,下面就简单解释几句典型程序 mov ah,N1\/\/就是将数值N1赋给ah and ah,0f0h\/\/就是将ah与0XF0相与 add ah,30h\/\/就是将ah与0X30相加然后将...

懂汇编语言的请进
作用和上面说的一样,但这也太笨了一点了吧.应该用dw 8 dup(0)这样更好,还有那个堆栈段定义的格式不对,没定义成功,在map文件的第一行有提示:no stack segment,不相信就试验一下,stack segment stack 'stg',这样才正确啊bb111.dw 0,0,0,0,0,0,0,0给堆栈定义8个字的空间 ...

汇编语言堆栈的问题
输入n个t后,到IP=40时,SP=0038H,堆栈最满.此时执行 -dss:0,显示:... ...13EC:0030 00 00 14 00 F0 13 F0 0D-13 00 0F 00 00 00 DC 13 由于每台电脑执行程序时,浮动地址不一,题目给定 PSP=1234H,与本机PSP段地址为13DCH相差后,依次填入下表:位移 栈内容 [十六进制](0032)...

汇编语言中 cs,ds,ss,es分别是那些英文单词的缩写?
ss:堆栈段寄存器, 是 stack segment 的缩写;es:附加段寄存器,是 extra segment 的缩写;想知道他们怎么用,就必须了解他们的用途。他们和其他寄存器如何合作,寄存器寻址和存储器寻址如何完成?单说这几个段寄存器,不涉及其他寄存器,是不能真正了解掌握他们的。寄存器是中央处理器内的组成部份。寄存器...

相似回答