汇编语言第六章——包含多个段的程序

今天我们来看看第六章。

在代码段中使用数据

我们知道在高级语言中,有数组这样东西。
那么在汇编语言中,我们又如何将一段数据保存在一段连续的内存中呢?
我们肯定不能随便找到一段内存,然后就往里面存,因为那样可能会覆盖那里原有的非常重要的东西。所以我们应当让系统为我们分配。
这里就又涉及到一个语句:

dw 0123,2312,34a3,1231,3456

这里dw是“define word” 的意思,即定义字型数据。
那么我们的这段数据存在哪里了呢?
这要看这条语句的位置。如果它位于代码段,那么就是从CS指向的地址开始。
但是这么一来,我们的CPU 怎么知道这一段不是代码呢?
这里我们就又要用到一个伪指令,我们这样做:

assume cs:cgg
cgg segment
	dw 0123,2312,34a3,1231,3456
	start:	mov bx,0
			mov ax,0
			mov cx,8
	s:		add ax,cs:[bx]
			add bx,2
			loop s

			mov ax,4c00H
			int 21h
code ends
end start

我们知道程序的末尾的end表示结束。
而这里end start则是在提示,我的语句从start那个地方开始。
所以电脑就会知道要从start处开始执行。

在代码段中使用栈

我们之前提到了栈,那么我们应该怎么在代码段中使用栈呢?
其实很简单,我们只需要用dw开辟一段内存就好了。
如:

dw 0,0,0,0,0,0,0,0,0

接下来我们只需要将SS:SP调整到位,就可以使用了。

将数据、代码、栈放入不同的段

为什么要放到不同的段?
有两个原因:

  1. 放在同一个段中我们需要自己小心,否则读错了会导致问题,而且本身也很混乱
  2. 我们学习的是8086模式,它的段空间只有64K,那么当我们的程序变得庞大时,这点空间是不够我们使用的

出于这两点,我们需要进行一些改变。
我们先展示一段代码,然后再依据这个来讲解:

assume cs:code,ds:data,ss:stack
data segment
	dw 1234h,2345h,2343h,2345h
data ends
stack segment
	dw 0,0,0,0,0,0,0
stack ends
code segment
	start:	mov ax,data
				mov ds,ax
				mov ax,stack
				mov ss,ax

				mov ax,4c00h
				int 21h
code ends
end start

你的第一反应可能是,我们只要定义多个段,然后用assume把他们和对应的寄存器关联就好了。
但事情并不像我们想的这样简单。
事实上,assume是一个伪指令,它是写给编译器看的,而CPU并不会得到它。
那么我们一个怎么实现这样的操作呢?
注意我们写的代码:

mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax

这里就是把对应的短段地址传给了CPU。
注意,这里的data和stack相当于常量,不能直接赋值给ds或ss
至于怎么识别代码段,这个前面已经说过,不在赘述。

这就是我们的第六章。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值