数据段data segment 堆栈段stack segment 代码段code segment的 段地址 有什么关系?系统是怎么分配 数据段 堆栈段 代码段 的段地址的,他们是连续相接的吗?只剩下10个财富 了sorry!系统是怎么分配 数据

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/11 02:44:47
数据段data segment 堆栈段stack segment 代码段code segment的 段地址 有什么关系?系统是怎么分配 数据段 堆栈段 代码段 的段地址的,他们是连续相接的吗?只剩下10个财富 了sorry!系统是怎么分配 数据

数据段data segment 堆栈段stack segment 代码段code segment的 段地址 有什么关系?系统是怎么分配 数据段 堆栈段 代码段 的段地址的,他们是连续相接的吗?只剩下10个财富 了sorry!系统是怎么分配 数据
数据段data segment 堆栈段stack segment 代码段code segment的 段地址 有什么关系?
系统是怎么分配 数据段 堆栈段 代码段 的段地址的,他们是连续相接的吗?
只剩下10个财富 了sorry!
系统是怎么分配 数据段 堆栈段 代码段 的段地址的,他们对应的内存单元段 是连续相接的吗?
assume cs:code,ds:data,ss:stack
data segment
dw 0,1,2,3,4,5
data ends
stack segment
dw 0,2,3,4,5,6
stack ends
code segment
start:
mov ax,[0]
add ax,[2]
add ax,[ 4]
add ax,[6]
push ax
code ends
end start

数据段data segment 堆栈段stack segment 代码段code segment的 段地址 有什么关系?系统是怎么分配 数据段 堆栈段 代码段 的段地址的,他们是连续相接的吗?只剩下10个财富 了sorry!系统是怎么分配 数据
对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段.我们可以将一组长度为N(N less or equal to 64KB)、地址连续、起始地址为16的倍数的内存单元作专门存储数据的内在空间,从而定义了一个数据段.比如用123B0H -- 123B9H这段内存空间来存放数据,我们就可以认为,123B0H -- 123B9H这段内存是一个数据段,它的段地址为123B0H,长度为10个字节.
如何访问数据段中的数据呢?将一段内存当作数据段,是我们在编程时的一种安排,可以在具体操作的时候,用DS存放数据段的地址,再根据需要,用相关指令访问数据段中的具体单元.
比如,将123B0H -- 123B9H 的内存单元定义为数据段.现在要累加这个数据段中的前3个单元的数据,代码如下.
mov ax,123BH
mov ds,ax ; 将123BH送入ds中,作为数据段的段地址
mov al,0 ; 用al 存放累加结果
add al,[0] ; 将数据段第一个单元(偏移地址为0)中的数值加到al中
add al ,[1] ; 将数据段第二个单元(偏移地址为1)中的数值加到al中
add al,[2] ; 将数据段第三个单元(偏移地址为2)中的数值加到al中.
栈 :栈是一种具有特殊访问方式的存储空间.它的特殊性在于,最后进入这个空间的数据,最先出去.
8086 CPU 提供相关的指令来以栈的方式访问内存空间,这意味着,在基于8086 编程的时候,可以将一段内存当作栈来使用.
8086 CPU 提供入栈和出栈指令,最基本的两个是 PUSH(入栈) 和 POP (出栈).比如 ,push ax 表示将寄存器ax 中的数据送入栈中,pop ax 表示从栈顶取出数据送入ax.8086 CPU 的入栈和出栈操作都是以字为单位进行的.
下面举例说明,我们可以将 10000H -- 1000FH 这段内存当作栈来使用.
mov ax,0123H
push ax
mov bx,226H
push bx
mov cx,1122H
push cx
pop ax
pop bx
pop cx
这里有两个问题.
其一,我们将10000H - - 1000FH 这段内存当作栈来使用,CPU执行push 和 pop 指令时,将对这段空间按照栈的后进先出的规则进行访问.但是,一个重要的问题是,CPU如何知道 10000H -- 1000FH 这段空间被当作栈使用?
其二,push ax 等入栈指令执行时,要将寄存器中的内容放放当前栈顶单元的上方,成为新的栈顶元素;pop ax 等指令执行,要从栈顶单元取出数据,送入寄存器中.显然 push,pop 在执行的时候,必须知道哪个单元是栈顶单元,可是,如何知道呢?
8086 CPU 中,有两个寄存器,段寄存器 SS 和寄存器 SP,栈顶的段地址存在SS中,偏移地址存放在SP中,任意时刻,SS:SP指向栈顶元素.push 指令和pop指令执行时,CPU从SS和SP中得到栈顶的址址.
现在,我们可以完整的描述 push 和 pop 指令的功能了,例如 push ax.
push ax 的执行,由以下两步完成.
1.SP = SP -2,SS:SP 指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
2.将ax 中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶.
在masm中有一条重要的伪指令 assume ,下面给出 ASSUME 的具体用法
Setting the ASSUME Directive for Segment Registers
Many of the assebler instructions assume a default segment.For example,
JMP assumes the segment associated with the CS register,PUSH and POP assume
the segment associated with the SS register,and MOV instructions assumes the segments
associated with the DS register.
When the assebler needs to reference an address,it must know what segment contains the address.It finds this by using the default segment of group addresses assigned with the
ASSUME directive.The syntax is :
ASSUME segresister :seglocation [,segregister :seglocation ]
ASSUME dataregister; qualifiedtype [,dataregister :qualifiedtype]
ASSUME [regiser:] NOTHING [,register :NOTHING]
ASSUME register :FLAT [,register :FLAT ]
The ASSUME directive can define a segment for each of the segment registers.the
segregister can be CS,DS,ES,or SS ( and FS and GS on the 80386/486).
段寻址伪指令 ASSUME
格式 :ASSUME [段寄存器]:[ 段名],[段寄存器]:[段名],...
功能 :用于告知汇编程序,段寄存器CS、DS 、ES 和SS 的内容将被设定为那些段或组的段址.所以 代码段,数据段,堆栈段的 地址是 可 以人为设置的.
在机器刚开机时,堆栈是还没有建立起来的,此时是不能用栈的.

数据段data segment 堆栈段stack segment 代码段code segment的 段地址 有什么关系?系统是怎么分配 数据段 堆栈段 代码段 的段地址的,他们是连续相接的吗?只剩下10个财富 了sorry!系统是怎么分配 数据 已知数据段定义如下: DATA SEGMENT ORG 512H VRA DW 9 VRB DB ‘BYTE’,0AH,0DH VRC DB 5 DUP(?)已知数据段定义如下:DATA SEGMENTORG 512HVRA DW 9VRB DB ‘BYTE’,0AH,0DHVRC DB 5 DUP(?)BUF DW 6 DUP(0,1,2 DUP(2,3),0) TABLE DB 0,1,4 汇编语言中,如何让DATAS SEGMENT下定义的数据段指的数的指针下移 有数据段如下:DATA SEGMENT ORG 10H CONT1 EQU 20H BUF1 DW 300H,0AFH COUNT2 EQU $-BUF1BUF2 DB 'ASDFG'DATA ENDS试问(1)BUF1和BUF2的偏移地址分别是多少?(2)count的值是多少?(3)指出单元BUF2+2的内容是多少? DATA SEGMENT X DB 3DUP(2,1,4DUP(1,0)) Y DD 6DUP(?) W EQU $-X Z DW 3 DATA ENDS 设DATA的段地址是20这是关于三级偏软的一道试题, 微机原理程序段data segment b dw,-1,0abch,’ef' c=$-b 这端程序中c=$-b什么 如何根据需要定义堆栈段的大小? assume cs:codesg,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start:mov ax,stack mov ss,ax mov sp,16 ;★将逻辑上设置的栈段真正设为栈 为什么要定义堆栈段,很多汇编程序都没有显性的用到堆栈段(既没有用到ss和sp,pop,push),但还是定义了堆栈段,并开辟了一定的存储空间,既然没用到,为什么要定义堆栈段并且开辟存储空间?如 汇编语言中data segment和dseg segment ,data segment的区别和用法 《微机原理》的习题求解在某系统中,已知当前(SS)=2360H,(SP)=0800H,请说明该堆栈段在存储器中的物理地址范围.若往堆栈中存有20个字节数据,那么SP的内容为什么值? 计算机组成原理的问题求解几道题1、CS=0100H,DS=1100H,SS=5555H代码段的20位起始地址是多少?数据段和堆栈段是多少?2、如上题假设,给出下列地址的段基值及偏移地址 01055H(存放代码) 12000H( 请求大大帮我把这段程序加上注释~十分感谢~试编写一个程序,要求能从键盘接收一个个位数N 然后响铃N次(响铃的ASCII码为07H).这是原题. DATA SEGMENT A DB 'PLEASE INPUT A NUMBER:','$'DATA ENDSCODES SEGMEN 汇编语言中data segment什么意思 已知从数据段DATA单元开始存放字节型的带符号数X和Y,请设计计算Y=6X+8的程序 已知SS=1000H,SP=2000H堆栈段最后一个单元的物理地址为13000H 求堆栈段的断首物理地址 栈顶物理地址 栈底偏移地址 微机原理,已知(SS)=9000H(SP)=0E200H则整个堆栈段物理地址范围? 微机原理堆栈物理地址SP,将1234ABCDH压入堆栈,堆栈指示器是SP=0100H,堆栈段寄存器SS=A000H,最后栈顶SP是多少?(答案是00FCH)为什么会是这个答案,不是SS*10H+SP就是物理地址了吗 为什么要减一