第三章
3.1 内存中字的存储
8086CPU中用16位寄存器来存储一个字。采用小端法,例如:
数据 20000(4E20H) 4E是高位 20是低位
0 20H
1 4EH
3.2 DS和[address]
还记得2.9节的段地址寄存器CS吗?这一节讲述了8086CPU有一个DS寄存器,通常用来存放要访问数据的段地址。
(CS用于指示下一条指令的地址,而DS用来存放要访问数据的段地址?)
mov bx,1000H
mov ds,bx #不能直接把数据放入寄存器,需要先送入一个一般的寄存器,再将一般寄存器的内容送入DS
mov al,[0]
[...]表示偏移地址,段地址直接从DS中读取。将DS:0送入AL
3.7 CPU提供的栈机制
8086CPU中也是栈的顶部地址最小。
考虑两个问题:1. CPU是如何知道哪段内存是当作栈来使用的?2. CPU是怎么知道哪个内存单元是栈顶的?
对于第一个,我们设想CPU中应该有记录栈顶上限和栈底的寄存器,这样在栈满入栈和栈空出栈时,可以判断行为是否合法。但是对于8086CPU,它并没有这样的寄存器,也就是说它需要我们在编程的时候自己操心栈顶吵界的情况。
对于第二个问题,回答是:8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址放在SS中,偏移地址放在SP中。任意时刻SS:SP指向栈顶元素。
因此,PUSH和POP都是先移动SP,再传送值。
3.10 栈段
是一个小总结,到此为止,我们经历了存放数据、指令(代码)、栈的内存,如果一个段用于存放数据、指令(代码)、段,那么它们分别被定义为”数据段”、“代码段“和”栈段“。
对于数据段,段地址在DS中,使用mov, add, sub等指令时,CPU就将数据段中的内容当作数据来访问;
对于代码段,段地址在CS中,将段中第一条指令的偏移地址放在IP中,CPU会将CS:IP内存中的数据当成指令来处理;
对于栈段,段地址在SS中,将栈顶单元的偏移地址放在SP中,在执行push, pop指令时,CPU将栈段当作栈空间使用。
因此CPU是如何看待内存中的数据,是根据段地址和偏移地址决定的。
实验2
第四章
章节基本介绍
本章准备编写完整的汇编语言程序,用编译器将它们编译成可执行文件。
4.1 源程序从写出到执行的过程
- 文本编辑器编写汇编语言
- 对源程序进行编译连接:使用汇编语言编译程序对源程序进行编译->目标文件;再用连接程序对目标文件进行连接->可执行文件
- 可执行文件中的程序和数据,指的是汇编程序翻译过来的机器码和源程序中定义的数据
- 可执行文件中的描述信息,例如程序有多大、要占用多少内存空间等
- 执行
4.2 源程序
4.2.1 伪指令
1.3中提到汇编语言的组成:汇编指令、伪指令、其他符号。现在介绍一下它们。
汇编指令,可以被编译为机器指令,最终被CPU执行;伪指令,没有对应的机器指令,也不就不会被CPU执行。伪指令的作用是指导编译器来进行相关的编译工作。
先介绍3种伪指令:
1. segment和ends是一对,它们定义了一个段,分别表示段的开始和结束,XXX表示的是段名。
XXX segment
...
...
...
XXX ends
2. end 表示汇编程序的结束,编译器遇到end就结束对源程序的编译。
3. assume 它假设某一个 段寄存器 与程序中某一个 段XXX 相关联。