1. 先考虑这样一个问题:计算以下8个数据的和,结果存放在寄存器ax中:

0123h 0456h 0789h 0abch 0defh 0fedh 0cbah 0987h

毫无疑问,要累加这些数据,就必须把这些数据先存放在内存单元中,然后循环读取每一个数据,进行累加。从何找到这段连续的内容单元?一般来说,我们无法自己决定使用哪段内存空间,所以把这个任务交给操作系统自己来决定:

代码

assume cs:code
code 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 21h
code ends
end

在上面的例子中,dw的意思是“define word”,即定义了已连串的字型数据(后面8个数据)。程序从哪里开始执行?从CS:IP指向的地方开始执行。然而这里,CS:IP指向的第一条指令是dw开始的定义,而我们希望是直接从mov bx, 0;这句开始执行,这样有可能造成执行出现了问题。如何解决?

1)可以在debug下,直接设置CS:IP,让IP指向mov bx, 0;也就是修改IP的值为:0010h;

2)告诉CPU从哪里开始执行我们的代码,即把程序修改为:

代码

assume cs:code
code 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 21h
code ends
end start

添加了:"start"和"end start"。start是一个标号,end start告诉CPU程序的入口是哪里。所以,end还有指明程序入口点的作用。在编译、链接之后,由“end start”指明的程序入口被转化为一个入口地址,存储在可执行文件的描述信息中。显然,这种做法比第一种做法现实得多。

2. 将数据、代码、栈放入不同的段:把这些内容全部放在代码段中无疑会让程序显得混乱而且难以管理和操作,容易出错,所以,要把数据、代码和栈放入不同的段中,这也体现了软件工程中“分而治之”的思想。

代码

assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends

stack segmetn
dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
stack ends

code 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 s

mov bx, 0
mov cx, 8
s0:
pop [bx]
add bx, 2
loop s0

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

1)定义多个段的方法:定义数据段和栈段跟定义代码段一样,都是:XXX segment ; XXX ends;

2)对段地址的引用:如何访问到段的开始地址,寻址是按照:段地址×16 + 偏移地址来实现的。每一个段的标号就是表示段地址,比如:data segment;中data就是数据段的段地址。

mov ax, data

mov ds, data

就是使ds指向了data段中的第一个单元,那么以后:mov [0], ax; 就是把ax的内容送入到data段开始的第一个内存单元;

但是,我们不能这样写:mov ds, data; data其实是一个段地址,一个值,这样写相当于把值直接送入ds,这是不允许的。

3)要注意,所谓的数据段,代码段,栈段都是我们自己定义的,是为了方便程序员阅读的,CPU并不知道哪些就是数据段,哪些是代码段,哪些是栈段。所以,data, code, stack只是一系列的标号而已,标号就是为了提高可读性。

assume cs:code, ds:data, ss:stack;这句只是将你定义的具有一定用途的段和相关的寄存器联系起来,并不是说,CPU知道cs指向了code, ds指向了data,ss指向了stack;所以,我们仍然需要在程序中写:

mov ax, stack

mov ss, ax

mov sp, 20h

这样类似的指令来指明ss指向了stack。所以,code, data, stack完全可以换成其他名字,只是我们在定义的时候需要定义一个可读性比较强的标号。

转载于:https://www.cnblogs.com/python_newbie/archive/2010/09/25/1834841.html

汇编语言复习摘要六——包含多个段的程序相关推荐

  1. 包含多个段的程序01 - 零基础入门学习汇编语言29

    第六章:包含多个段的程序01 让编程改变世界 Change the world by program 引言 前面我们写的程序中,只有一个代码段. 现在有一个问题是: 如果程序需要用其他空间来存放数据, ...

  2. 《汇编语言》第6章 -包含多个段的程序 检测点答案,实验5,总结

    第6章:包含多个段的程序 1.在代码段中使用数据 "dw":define word(定义字型数据:) "db"(定义字节型数据:) "start&qu ...

  3. 包含多个段的程序---汇编学习笔记

    包含多个段的程序 要使用一段安全的空间,第五章中我们说0:200~0:2ff是相对安全的.可这段代码容量只有256个字节. 合法地通过操作系统取得的空间都是安全的. 程序取得所需空间的方法有两种,一是 ...

  4. 汇编语言之第六章包含多个段的程序

    一:dw=define word 即使用dw定义字型数据(数据之间以逗号分隔),dw 既可定义数据,也可以说用它开辟内存空间 db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1 d ...

  5. 汇编语言复习摘要四——第一个汇编程序

    1. 程序执行流程:简单说下,编写汇编程序->对程序进行编译和链接(注意,是两个动作)->执行可执行文件.操作系统将依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进 ...

  6. 汇编语言复习摘要二——寄存器

    CPU中的主要部件是寄存器,寄存器是CPU中程序员可以用指令来读写的部件.通过改变各种寄存器中的内容来实现对CPU的控制.8086CPU有14个寄存器,这里不一一列举. 1. 通用寄存器:8086CP ...

  7. 计算机网络复习-第六章应用层

    计算机网络复习-第六章应用层 第六章 应用层 应用层协议概述 应用层协议特点 每个应用层协议都是为了解决某一类应用问题,而问题的解决又往往是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的 ...

  8. 北京理工大学汇编语言复习重点(可打印)

    文章目录 前言 第一章:基础 性能指标计算 储存器原理 第二章:微处理器管理模式 CPU工作模式 实模式 保护模式 虚拟8086模式(V86模式) 寄存器 概述 GDTR(Global Descrip ...

  9. 计算机导论摘要,[计算机导论复习摘要.doc

    [计算机导论复习摘要 计算机导论复习摘要 计算机的发展与划代 从1946年第一台电子计算机ENIAC问世至今已经历了五代的发展历史. 1945 1955 1965 1975 80年代以后划分标准第一代 ...

  10. 汇编语言(王爽第三版) 实验5编写、调试具体多个段的程序

    参考:http://blog.sina.com.cn/s/blog_171daf8e00102xclx.html 汇编语言实验答案 (王爽):https://wenku.baidu.com/view/ ...

最新文章

  1. 六个最佳的软件工程实践(基于构件的体系结构、可视化建模)
  2. 华为生态链的全方位解读
  3. 通达信板块监控指标_【精选指标】通达信创业板涨停变色主图指标,助你股海捉龙擒牛!...
  4. NullPointerException异常的原因及java异常??
  5. android n等分 layout,RecyclerView GridLayoutManager 等分间距
  6. java 求集合平均数_图像二值化方法介绍(转载学习)
  7. 使用Asp.net Core3Blazor 的全栈式网站开发体验
  8. Google Maps API 以某一经纬度为中心,以某一长度位半径画圆 Draw the radius of a circle...
  9. weblogic控制台查看日志_weblogic 控制台日志保存到文件
  10. Linux---线程安全
  11. 3gpp协议服务器,NR-3GPP协议清单汇总
  12. 详细教您如何把wav转换成mp3格式
  13. 利用python脚本监控Tomcat服务器
  14. 小米 win10 android 双系统,PC平板二合一 运行win10/安卓双系统
  15. 这个年龄计算程序相当不科学,体验还是差差哒
  16. 家用计算机硬件升级方案,旧电脑如何升级?旧电脑配置升级推荐方案
  17. 高通Linux Android 平台中的蓝牙功能学习 (4)-- Android Marshmallow 中的蓝牙 4.2
  18. Java异常处理流程
  19. 梯度提升树(GBDT)详解之一:回归举例
  20. 好用的PHP星辰网址缩短源码V2.1.1

热门文章

  1. vc2005 seh新认识
  2. vmware挂载共享目录
  3. ZooKeeper分布式过程协同技术详解2——了解ZooKeeper
  4. 【BZOJ 1038】[ZJOI2008]瞭望塔
  5. HTML入门之003
  6. Entlib DAAB映射枚举类型
  7. 强联通块tarjan算法
  8. 腾讯2012实习生招聘面试题:矩阵中A移动到B一共有多少走法
  9. RDP(远程桌面很慢) slow performance, Hyper-V,IPv4 Checksum offload
  10. 转:Secure CRT 中文乱码问题解决