<学习笔记>王爽汇编语言__包含多个段的程序
来源:互联网 发布:淘宝上琴韵钢琴怎么样 编辑:程序博客网 时间:2024/04/29 18:53
在前面的程序中,只有一个代码段。现在有一个问题是,如果程序需要其他空间来存放数据,使用哪里呢?
程序取得所需空间的方法有两种,一是在加载程序的时候为程序分配,再就是在程序执行的过程中向系统申请。我们若要一个程序在被加载的时候取得所需空间,则必须要在源程序中作出说明。我们通过在源程序中定义段来进行内存空间的获取。
在代码段中使用数据
如果要编程计算以下8个数据的和,结果存在ax寄存器中:
0123h 0456h 0789h 0abch 0defh 0fedh 0cbah 0987h
我们可以在程序中定义自己的数据,然后进行操作,具体做法看下面的程序:
assume cs:codecode segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h mov bx,0 mov ax,0 mov cx,8 s: add ax,cs:[bx] add bx,2 loop s mov ax,4c00h int 21hcode endsend
这样编译连接出来的程序直接执行可能会存在一些问题,应为程序并不是从我们希望的入口开始运行,所以我们可以进行以下修改:
assume cs:codecode segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h start: mov bx,0 mov ax,0 mov cx,8 s: add ax,cs:[bx] add bx,2 loop s mov ax,4c00h int 21hcode endsend start
此时程序执行时CS:IP最初指向Start的位置。
在代码段中使用栈:
如果将上个程序的要求改为:利用栈,将程序中定义的数据逆序存放。
我们可以这样来写这段程序:
assume cs:codecode segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h dw 0,0,0,0,0,0,0,0start: mov ax,cx mov ss,ax mov sp,30h mov bx,0 mov cx,8 s: push cs:[bx] add bx,2 loop s mov bx,0 mov cx,0 s0: pop cs:[bx] add bx,2 loop s0 mov ax,4c00h int 21hcode endsend start
将数据,代码,栈放入不同的段
在上面的程序中我们将数据和栈还有代码全部放在了一个段里,我们在编程的时候要注意何处是栈,何处是代码,这样做明显会有两个问题:
(1)把他们放到一个段中使程序显得混乱
(2)如果数据过多超过了64kb,就不能放到一个段中
所以我们需要用多个段来存放数据,代码,和栈。
我们来看以下程序:
assume cs:code,ds:data,ss:stackdata segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdata endsstack segment dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0stack endscode segment start: mov ax,stack mov ss,ax mov sp,20h mov ax,data mov ds,ax mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s0 mov bx,0 mov cx,8 s0: pop [bx] add bx,2 loop s0 mov ax,4c00h int 21hcode endsend start
现在,程序中有多个段了,如何访问段中的数据呢?当然要通过地址,而地址是分为两部分的,即段地址和偏移地址。在程序中,段名就代表了段地址,所以“mov ax,data”代表将名称为“data”的段的段地址送入ax中。注意"mov ds,data"指令是错误的,CPU不允许段寄存器直接接受一个具体数值。
伪指令"assume cs:code,ds:data,ss:stack"是将cs,ds,ss分别和code,data,stack段相连。
- <学习笔记>王爽汇编语言__包含多个段的程序
- <学习笔记>王爽汇编语言__寄存器
- 汇编语言学习笔记(六)包含多个段的程序
- <学习笔记>王爽汇编语言__再论寄存器
- <学习笔记>王爽汇编语言__[BX]和loop指令
- <学习笔记>王爽汇编语言__转移指令原理
- <学习笔记>王爽汇编语言__标志寄存器
- <学习笔记>王爽汇编语言__更加灵活的定位内存地址的方法
- <学习笔记>王爽汇编语言__处理数据的两个基本问题
- 王爽《汇编语言》(第二版) 学习笔记 (第六章 包含多个段的程序 )
- 王爽《汇编语言》(第二版) 学习笔记 (第六章 包含多个段的程序 )
- 汇编语言学习笔记(6)——包含多个段的程序
- 汇编语言学习——第六章 包含多个段的程序
- 汇编语言学习第六章-包含多个段的程序
- 汇编学习笔记--包含多个段的程序
- 【学习笔记】6.包含多个段的程序
- 王爽汇编语言学习笔记(四) --第一个程序
- 王爽《汇编语言》第6章 包含多个段的程序
- maven配置使用nexus仓库
- 购物垂直搜索,让买家掌握更多的决策信息
- ios多线程
- 软件工程 第五章 程序设计须知
- 软件维护
- <学习笔记>王爽汇编语言__包含多个段的程序
- HTTP Basic Authentication认证
- 编译环境与生成环境的JDK版本不一样,报:java.util.zip.ZipException: error in opening zip file
- poj1061
- 开博
- HP DL380 G5 服務器Raid1硬盤損壞更換注意事項
- jquery中的addClass(),removeClass(),toggleClass()
- awk中使用shell的环境变量
- JavaScript && OOP