寄存器与栈的初识
寄存器
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各种器件进行工作
- 内部总线连接各种器件,在他们之间进行数据的传输
不同的cpu,寄存器的个数、结构都是不同的
通用寄存器
- AX、BX、CX、DX这四个寄存器通常用来存放一半性的数据结构,被称为“通用寄存器”
以(8086cpu 16位寄存器)ax为例子
|---------------------------AX--------------------------------|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
8086cpu上一代cpu寄存器都是8位。 寄存器为了保证向下兼容。
height low
ax = ah + al
bx = bh + bl
cx = ch + cl
dx = dh + dl
几条汇编指令
mov ax,18 将18送入寄存器
mov ah,78 将78送入寄存器ah
add ax,8 将寄存器ax中的数值加上8
mov ax,bx 将寄存器bx中的数据送入寄存器
add ax,bx 将ax和bx的数字相加,结果存在ax中
一个16进制数 需要4个二进制位表示
用最多4条指令计算2的四次方
mov ax,2
add ax,ax
add ax,ax
add ax,ax
16位结构的寄存器
- 运算器一次最多可以处理16位的数据
- 寄存器最大的宽度位16位
- 寄存器和运算器之间的通路为16位
物理地址
- cpu访问内存单元时,要给出内存单元的地址。每一个内存单元都有一个唯一的地址,即:物理地址
- cpu通过地址总线送入存储器的,必须是一个内存单元的物理地址
8086cpu给出物理地址的方法
- 8086cpu有20位地址总线,可以传送20位地址,达到1m寻址能力
- 但是,他是16位结构,只能发送16位地址,表现出来的寻址能力只有64kb
-
采用一种在内部用两个16位地址合成的方式形成一个20位地址总线(通过地址加法器)
8086cpu在读写内存时,cpu会提供两个16位地址
一个称为段地址,另一个被称为偏移地址
段地址,和便宜地址,通过内部总线,送入一个称为地址加法器的部件
地址加法器将两个地址合成一个20位物理地址物理地址 = 段地址*16+偏移地址
段寄存器
- 段地址放在段寄存器中:8086cpu中有4个寄存器:cs、ds、ss、es
CS和IP
CS和IP是两个关键的寄存器
CS --> 代码段寄存器
IP --> 指针寄存器
在某个时刻cpu将cs:ip指向的内容当作指令执行. (cs_存放的地址*16+ip_存放的地址)
修改CS和IP指令
在汇编语言中,程序员可以进行读写操作的只有寄存器,可以对寄存器的读写操作来对cpu进行操作
8086cpu中mov命令可以改变大多数寄存器的值,但是不能对cs和ip进行操作
jmp指令可以修改cs、ip命令,同时修改cs和ip的内容
···
jmp 段地址:偏移地址
jmp cs:ip
的指令来完成
···
内存访问
1. 字访问和字节访问
* 一个字 = 两个字节
* 字节存放:
A地址 --> 存放字节
* 字存放 :
A地址 --> A地址+1 -- A地址 = 存放字
//给定一个存放字的地址单元,需要在其基础上+1
2.DS和[address]
- DS: 寄存器 存放段地址
- [address] 偏移地址
如果 DS = d800
那么 “[]” 中括号就 等于d800
[10] 就等价于地址 d800:0010
DS = d800
ax = [10] //将d800:10的值传入ax中
[20] = ax //将ax中的值放入d800:10中
3. mov、add、sub指令
- mov mov ax,bx --- ax=bx
- add add ax,bx --- ax=ax+bx
- sub sub ax,bx --- ax=ax-bx
4. 数据段
- 在编程时,据需要
将一组内存单元定义位一个段(长度<=64kb地址连续、起始地址为16的倍数) 比如 d8000 - d8009我们就可以将其定义为一个段地址
5.栈
-
后进先出
-
cpu提供的栈机制
1.两个基本指令
* push
* pop
2.cpu在入栈出栈如何知道栈顶的位置
* 两个寄存器SS、SP
* SS储存栈顶的段地址SP储存栈顶的位地址- 入栈--栈顶从高地址向低地址执行
6.栈顶超界
* 一个栈的空间是有限的:
一个栈的空间为--d800:0020 -- d800:0010
空栈的栈顶为 d800:0021 当栈顶为d800:0010时候 继续push 会对栈外的数据覆盖
白茶清欢无别事,我在等风也等你。

浙公网安备 33010602011771号