包含多个段的程序

包含多个段的程序

程序获取所需要的内存空间:

  1. 在加载程序的时候为程序分配
  2. 在执行的过程中向系统申请(本课程中不讨论第二种方法)

在代码段中使用数据

我们可以用dw来定义字型数据

	code segment
	         dw 0123h,0456h,0789h
	         ...
	 code ends

在该代码段开头的三个字大小的内存空间,会被解释为汇编指令,我们在debug中用u指令可以看到这些机器码对应一些”莫名其妙的汇编指令“
为了让这些数据不影响正常指令进入的位置,我们需要一个标号,来告诉编译器真正的汇编指令从哪里进入,start的作用就是如此(start是告诉编译器,并不是告诉cpu),例如:

	code segment
            dw...
     start:....
     code ends
     end start

start会让cs:ip指向汇编指令开始的地址。

在代码段中使用栈

我们还可以在段中使用栈,方法就是用dw定义一堆0,来达到申请内存空间的目的。然后可以通过ss:sp指向最后一个0后面的一个字的地址(栈底),把这段空间当作栈使用。

使用多个段

我们之前只是把数据和栈还有代码(汇编指令)都放在一个段中,这样做可能会引起结构不清晰的问题。我们可以用多个段来分别存储数据,代码和栈,例如

	assume cs:code,ds:data,ss:stack
	data segment
	        dw....
	 data ends
	 
	 stack segment
	          dw 0,0,.....
	 stack ends

      code segment
      start:....
      code ends
      end start

这就是用多个段非常经典的一个程序

  • 总之,cpu到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对cs:ip,ss:sp,ds等寄存器的设置来决定的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值