文章目录
一、基础知识
1.汇编语言的组成
(1)汇编指令:机器码的助记符,有对应的机器码。
(2)伪指令:没有对应的机器码,由编译器执行,计算机并不执行。
(3)其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码。
汇编语言的核心是汇编指令,它决定了汇编语言的特性。
2.存储器
CPU是计算机的核心部件,它控制整个计算机的运作并进行运算。要想让一个CPU工作,就必须向他提供指令和数据。指令和数据在存储器中存放,也就是我们平时所说的内存。
3.指令和数据
在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。CPU在工作时,有时把信息看作指令,有时看作数据,为同样的信息赋予不同的意义。
4.存储单元
存储器被划分成若干个存储单元。电子计算机最小的信息单位是bit,8个bit组成一个Byte,即8个二进制位。微机存储器的容量是以字节位最小单位来计算的。对于拥有128个存储单元的存储器可以说,他的容量是128个字节。
5.CPU对寄存器的读写
必须和外部器件进行下面三类信息的交互。
(1)存储单元的地址(地址信息);
(2)器件的选择,读或写的命令(控制信息);
(3)读或写的数据(数据信息)。
计算机中专门有连接CPU和其他芯片的导线,称为总线。从物理上讲就是导线的集合,从逻辑上又分为地址总线,控制总线和数据总线。
地址总线的宽度决定了CPU的寻址能力;
数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量;
控制总线的宽度决定了CPU对系统中其他器件的控制能力。
6.实验
1)关于debug
查看、修改寄存器的内容:R
查看内容:D
修改内容:E
将内容解释为及其支流和对于的汇编指令:U
执行CS:IP指向的内存单元处的指令:T
以汇编指令的形式向内存中写入指令:A
2)示例
(1)CS:IP指向变化。
(2)hello world
stack segment stack
db 200 dup(0)
stack ends
data segment
disp db 'Hello World!$'
data ends
code segment
assume cs:code,ds:data,ss:stack
main: mov ax,data
mov ds,ax
lea dx,disp
mov ah,09h
int 21h
mov ah,4ch
int 21h
code ends
end main
(3)修改屏幕的显示
二、寄存器
一个典型的CPU由运算器、控制器、寄存器等器件构成,他们靠内部总线相连。在CPU中:
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
内部总线连接各种器件,在他们之间进行数据的传送。
1.8086CPU给出物理地址的方法
(1)提供两个16位地址,一个称为段地址,一个称为偏移地址;
(2)他们进入地址加法器,合并为一个20位的物理地址送入输入输出控制电路,再通过地址总线送到存储器;
地址加法器采用 物理地址=段地址*16+偏移地址的方法合成物理地址。
2.CS和IP
他们是8086CPU中最关键的两个寄存器,只是了CPU当前要读取指令的地址。CS位代码段寄存器,IP位指令指针寄存器。
在任意时刻,CPU将CS:IP指向的内容当作指令执行。
3.修改CS/IP的指令
需要使用如jmp等转移指令,而不能使用如mov的传送指令。
三、寄存器(内存访问)
1.内存中字的存储
1)对于8086CPU,用16位的寄存器来存储一个字。在内存中存储时,由于内存单位是字节单元(一个单元存放一个字节),则一个字需要两个内存单元来存放。
2)字单元的概念:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元存放字型数据的高位字节。
2.DS和[address]
1)DS寄存器,用来存放要访问数据的段地址。
[address]中的address表示偏移地址。
2)示例
读取10000H单元的内容,用如下的程序段进行:
mov bx,100H
mov ds,bx
mov al,[0]
a) [0]说明内存单元的偏移地址为0,他的段地址默认放在ds中,执行时会自动从ds中取出。
b) 8086CPU不支持将数据直接送入段寄存器,故需要用bx寄存器作为媒介。
3)将al中的数据送入10000H中
mov bx,1000h
mov ds,bx
mov [0],al
关键的区别在于最后一步,其余步骤类似
3.字的传送
在mov指令中给出16位的寄存器,就可以进行16位数据的传送。比如:
mov ax,1000h
mov ds,ax
mov ax,[0]
内存中的情况:
10000H | 23 |
---|---|
10001H | 11 |
程序执行后
1000:0处存放的字型数据送入ax;
1000:1单元存放字型数据的高八位,送入ah;
1000:0单元存放字型数据的低八位,送入al;
故ax=1123H
4. mov、add、sub指令
1)指令的几种形式:
mov 段寄存器,寄存器;
mov 寄存器,段寄存器;
mov 内存单元,寄存器;
mov 段寄存器,内存单元;
以"mov 段寄存器,内存单元"为例,在Debug中进行验证:
(a)目标:将10000H处存放的字型数据送入ds;
(b)指令:
(c)结果:
由图中可知,ds的数据发生了改变,从而验证该指令成立。
2)add,sub指令与mov一样,都有两个操作对象。
3)他们都不能对段寄存器进行操作。
以"add ds,ax"为例进行验证:
5.数据段
在编程时,可以将一组内存单元当作专门存储数据的内存空间,定义为一个数据段。这不过是在编程时的一种安排,在具体操作时,可以用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
例如:
需注意,一个字型数据占据两个单元,故偏移地址是0,2,4。
6.栈
(1)栈是存储空间,特殊性在于先进后出。
(2)在8086CPU中,有段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。
(3)push ax的执行,由以下两部分完成。
a)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
b)将ax中的内容送入SS:SP指向的内存单元处,SS:SP指向新栈顶。
(4)pop ax的执行,由以下两部分完成
a)将SS:SP指向的内存单元处的数据送入ax中;
b)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶;
(5)当栈空时,SS:SP指向栈空间最高地址单元的下一个单元。
(6)栈顶超界的问题
在栈满的时候使用push指令入栈,或栈空的时候再使用pop指令出栈,都会发生栈顶超界问题。
如果CPU中有记录栈顶上限和栈底的寄存器,可以通过填写这些寄存器来指定栈空间的范围。
(7)栈段
将一段内存当作栈段,仅仅是编程时的一种安排。CPU并不会由于这种安排,就在执行push、pop等栈操作指令时自动地将我们定义地栈段当作栈空间来访问,而是通过SS:SP指向我们定义的栈段。