assume cs:code,ds:data,ss:stack
data segment
dw 0,0,0,0,0,0,0,0,0 #9个数据时 ds=076a ss=076c cs=076d
#8个数据时 ds=076a ss=076b cs=076c
data ends
stack segment
dw 0,0,0
stack ends
/*
stack segment
dw 0,0,0
stack ends
data segment
dw 0,0,0,0,0,0,0,0,0 #9个数据时 ds=076b ss=076a cs=076d
data ends
*/
code segment
start:mov ax,stack
mov ss,ax
mov sp,6
mov ax,data
mov ds,ax
mov ax,4c00h
int 21h
code ends
end start
编译器的处理方式是将data中的所有内容放在一个段的起始地址处,stack里的所有内容放在后续一个段的起始地址处(这也是汇编指令segment的本义:将不同数据分段)。这样,即使data中只包含一个字节,也要占一个段(16个字节),所以,一个段实际占用的空间=(段中字节数+15)/ 16。而哪个段在前面取决于代码里哪个段写在前面。
assume cs:abc
abc segment
dw 0123h,0456h,0789h,0abch,0123h,0456h,0789h,0abch
dw 0,0,0,0,0,0,0,0
start:mov ax,cs
mov ss,ax
mov sp,20H
mov bx,0h
mov cx,8
s:push cs:[bx]
add bx,2
loop s
mov bx,0h
mov cx,8
s0:pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
abc ends
end start
关于以上代码引发的奇怪现象:
1,设置ss和sp时栈内出现奇怪数据:每次初始化栈时sp上方都会出现0000??006a07a301,似乎是什么标识。考虑到入栈时会被覆盖,出栈后数据无用,所以不影响结果;
2,执行后面的指令时ds和ss的内容会出现奇怪的数据。多次运行后发现,ds改变的原因是ss数据变多后sp上方出现的标识会覆盖ds的数据;ss的奇怪数据出现在出栈后的地方,不影响结果 。(这一段原因不明,不再研究。因为下段代码发现不会导致内存的覆盖。而且可以观察到,栈指针sp=0时继续push,sp从0变成了fffe,数据保存到**“栈底”**了)
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
data ends
stack segment
db 8 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,8
push ax
push ax
push ax
push ax
push ax
push ax
mov ax,4c00h
int 21h
code ends
end start
上图准确的说,start不修改ip,而是标识程序的入口。
汇编语言中的assume的作用:
就算在开头加上了assume ds:data,代码段中也不能少了mov ax,data,mov ds,ax。
https://blog.csdn.net/fdfdsds/article/details/86701499