汇编语言(第3版)- 包含多个段的程序

在这里插入图片描述

包含多个段的程序


程序取得所需空间有两种方法:

  1. 加载程序时为程序分配。
  2. 程序执行过程中向系统申请。。也就是动态获取。

之前的章节只有代码段,这里开始引入数据段和栈段。

在代码段中使用数据

新的指令dw

define word, 定义一个字。

ax 存放8个数的和。

assume cs:code
code segment
	dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0997h
	
	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

这个程序其实是无法运行的。

因为cs:ip 指向的并不是要执行的指令mov bx,0 而是定义的数据0123h

解决办法是 使用end 伪指令的另一个用法,end xxx 指定程序的入口。xxx为自定义的名字。

上述代码改为

assume cs:code
code segment
	dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
	
main:	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 main

这样cs:ip 执行的第一条指令就变成了main指向的指令mov bx,0

在代码段中使用栈

关键代码就一个。通过dw 定义来开辟内容。

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 #这32个字节就可以 当成栈来使用。感觉用16个字节就够了,不晓得为啥搞32个。

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

把数据、代码、栈放到一个段的问题:

  1. 程序显得混乱
  2. 如果数据、栈和代码需要的空间超过64KB, 就不能放到一个段中了。(这是8086模式的限制,一个段的容量最大为64KB)

使用多个段的示例:

assume cs:code, ds:data, ss:stack ;定义了三个段 code,data,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,0,0,0,0,0,0,0 
stack ends

code segment
start:	mov ax,stack # stack 段的首地址
				mov ss,ax
				mov sp, 20h;
				
				mov ax, data ;
				mov ds, ax; ds指向data 段的首地址
				
				mov bx,0
				mov cx, 8
				
s:		  push  [bx]
  			add bx, 2
  			loop s  ;以上将data段中的0~15单元中的8个字型 数据一次入栈
  
  			mov bx,0
  			mov cx,8
  	s0: pop [bx]
  	    add bx,2
  	    loop s0;  出栈,把数据放回到data段。 如此就把数据逆序了。
  			mov ax, 4c00h
  			int 21h
code ends

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值