汇编语言(王爽)6章部分截图笔记代码段空间分配和sp=0-2的场合

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值