寄存器与栈的初识

寄存器

  • 运算器进行信息处理
  • 寄存器进行信息存储
  • 控制器控制各种器件进行工作
  • 内部总线连接各种器件,在他们之间进行数据的传输

不同的cpu,寄存器的个数、结构都是不同的

通用寄存器

  1. 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位

物理地址

  1. cpu访问内存单元时,要给出内存单元的地址。每一个内存单元都有一个唯一的地址,即:物理地址
  2. cpu通过地址总线送入存储器的,必须是一个内存单元的物理地址

8086cpu给出物理地址的方法

  1. 8086cpu有20位地址总线,可以传送20位地址,达到1m寻址能力
  2. 但是,他是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]

  1. DS: 寄存器 存放段地址
  2. [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储存栈顶的位地址

    1. 入栈--栈顶从高地址向低地址执行

6.栈顶超界

* 一个栈的空间是有限的:
	一个栈的空间为--d800:0020 --  d800:0010
		空栈的栈顶为 d800:0021  当栈顶为d800:0010时候 继续push 会对栈外的数据覆盖
posted @ 2019-12-16 21:01  zlisang  阅读(574)  评论(0)    收藏  举报