assume cs:code,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
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
问题:1.设程序加载后,CODE段的段地址为X,则DATA段的段地址是什么?STACK段的段地址是什么?
2.对于如下定义的段:
name sgement
.....
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为多少?
答案:1.X-2,X-1
2.(N/16+1)*16
自已刚学汇编,看了好久都没看明白这两题为什么是这个答案,为什么这题能从DS的值推出CS的值呢,是不是DS和CS以用SS有一定的数值联系啊?望各位高手替俺看看,不胜感激!!
------解决方案--------------------------------------------------------
DATA 段的段址是要自己赋予 DS 的. STACK 也是, 不过 SS:SP 的设置可以通过在 stack segment 语句上加上 stack 的修饰来实现自动赋值, 如 stack segment stack 这样. 这是因为 exe 格式的文件中, 其文件头部结构里有专门的域来存放缺省初始的 SS:SP.
各个段在内存中是紧连着分布的, 而且, 如果没有特别的指派, 它们的顺序也和源程序中出现的一致. 所以, 往往可以通过某个段的段址, 相关段的大小来推算出其它段的段址. 比如, code 段的段址为 x, stack 段为 7 个word, 紧排在 code 段之前, 由于段的基准大小为 16 字节, 所以 stack 实际占用 16 字节, 所以其段址就是 (x-1) 了. data 段址类似