[置顶] [汇编学习笔记][第六章包含多个段的程序]
2016-04-20 16:37
288 查看
第六章 包含多个段的程序
程序取得空间的方法有两种在加载程序的时候为程序分配
程序执行过程向系统申请
在课程中不讨论第二种(malloc)
6.1 在代码段使用数据
从规范的角度,我们是不能自己随便决定那段空间可以使用,应该让系统来为我们分配。在程序中,定义我们希望处理的数据,这些数据会被编译,作为程序的一部分写入可执行文件。当可执行文件被加载入内存时,这些数据也同时被加载入内存中。程序6.1
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
dw即“define word”定义字型数据(16位)
程序6.2
assume cs:code code segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h start: mov bx,111H 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这个指令,start并不是保留字符
主要是end的作用,end除了通知编译器程序结束,还可以通知编译器程序的入口在什么地方。这里我们用end制定了入口在标号start的地方,我们也可以制定标号dddd,yyyy。
6.2 在代码段中使用栈
代码6.3assume cs:code
code segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 start: mov sp,30h code ends end
解读内存:
CS:00- CS:0F 存放数据
CS:10- CS:2F 存放栈
所以栈指针初始为CS:30
6.3 将数据,代码,栈放入不同的段
放入同一段有两个问题放入同一段,程序显得混乱
如果数据,栈和代码超过64KB,就不能放到一个段里了(X86约束)
代码6.4
assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0defh,0fedh,0cbah,0987h data ends stack segment 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,4c00h int 21h code ends end start
不难想到为什么叫段地址叫做
ds,
ss,
cs了吗,分别就是
data segment,stack segment,code segment的缩写
对于mov ax,data的意义
名称为”data”的段的段地址送入ax。一个段的段地址可以由段名表示
还有几个疑问
assume到底有什么实质作用?
作者说,并不会是cpu的寄存器指向这些段,不必去深究。。暂时也没看到深究的必要。如果以后有必要的话,一定会深究到底。
相关文章推荐
- 【python】read_csv+编码问题
- [汇编学习笔记][第六章包含多个段的程序]
- 大中型Web站点解决高并发访问的优化方案
- Android 如何加载大图片
- --force
- spring事务管理
- C++里的继承和多态(下)——单继承、多继承、菱形继承(含虚拟函数的继承)
- 投简历,切忌这三大雷区!
- 腾讯2016校招技术岗面试经历
- iOS APP 发布上架流程
- $Android AlarmManager的用法详解
- Filter中访问spring ioc容器中的对象的方式
- 一个简单的例子让你理解值传递和引用传递
- XAudio2学习之SimpleAPO
- windows环境下Redis+Spring缓存实例讲解
- 嵌入式工程师该如何选择合适的开发系统
- 嵌入式工程师该如何选择合适的开发系统
- Axis2c开发Webservice时,接口参数不支持中文字符
- json 特殊字符 javascript 特殊字符处理(转载)
- CHAPTER 2 How the backpropagation algorithm works