注意:因为每个人记忆与思维的差异,对知识的理解在难易性、熟练度和重要性上带来很大差异,这些笔记是从我的视野出发进行的归纳,有些内容我觉得简单或潜移默化中已经掌握,所以可能并没有在思维导图和内容摘录中体现;反之亦然,有些内容可能读者觉得没有必要在笔记中呈现,却可能恰恰是我的短板或者偏重的地方。
一、思维导图
二、关键内容摘录
1、编写汇编程序——编译——连接——执行程序
2、可执行程序包含两部分内容:程序(机器码和源程序中定义的数据)、相关描述信息(如:程序多大,占用多少内存空间)
3、操作系统依照可执行文件的描述信息将可执行文件中的机器码和数据加载入内存,并进行相关初始化(比如设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。
4、一段示例程序
assume cs:codesg
codesg segment
mov ax,0123h
mov bx,0456h
add ax,bx
add ax,ax
mov ax,4c00h
int 21h
codesg ends
end
end:汇编程序结束标记,必须在结尾处存在。注意与ends 区分,ends是与segment成对使用的。
assume:该伪指令将特定用途的段和相关的段寄存器关联起来。
5、伪指令:
段名 segment
。
。
。
段名 ends
end
6、标号。汇编程序中除了汇编指令和伪指令外,还有一些标号,比如“codesg”。一个标号指代了一个地址。比如codesg在segment的前面,作为一个段的名称,这个段的名称将被编译、连接程序处理为一个段的段地址。
7、返回指令
mov ax,4c00h
int 21h
#这两句实现的功能是程序返回。
8、关于连接的作用
- 当源程序很大时,可以将它们分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接在一起,生成一个可执行文件。
- 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件。
- 一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这些内容处理为最终的可执行信息。所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。
9、完成一个汇编程序从写出到执行的全部过程:
10、用debug调试程序的加载顺序是:command(将一个可执行文件中的程序加载入内存,并设置CS:IP指向程序入口)加载debug.exe,debug.exe加载“被调试程序.exe”;返回顺序是:从.exe程序返回到debug(程序调试结束),从debug返回到command(-q退出debug)。debug也是将程序加载入内存,设置CS:IP指向程序入口,但是debug并不放弃对CPU控制。debug将程序从可执行文件加载入内存后,cx中存放的是程序的长度(程序字节个数)。
11、DOS系统中.exe文件中的程序的加载过程。
12、PSP(程序段前缀program segment prefix)是什么,有什么作用?
一般来说,PSP是256个字节,当程序生成了可执行文件以后,在执行的时候,先将程序调入内存,这个时候DS中存入程序在内存中的段地址,紧接着是程序的一些说明,比如说程序占用多大空间等等,这就是PSP,一般PSP占256个字节,然后才是真正的程序地址,将CS指向这里,IP设为0000,为什么一般CS要比DS大10H,就是因为这个原因。简单说:DS存放的是程序段地址,由于PSP的存在,真正要执行的地址是DS再加上256个字节,真正的地址是DS*16(左移4位)+256(数据段段内偏移地址),化简一下:DS*16+0+16*16=16*(DS+16)真正的地址又可以写成:cs*16(左移4位)+0(代码段段内偏移地址),所以CS相当于DS+16,化成十六制是DS+10H。相关内容可见:https://baike.baidu.com/item/%E7%A8%8B%E5%BA%8F%E6%AE%B5%E5%89%8D%E7%BC%80/2173868?fromtitle=psp&fromid=16689743&fr=aladdin
13、关于bytes symbol space free的讨论:http://bbs.csdn.net/topics/60302518