8086汇编 (02)--------------------------------------寄存器
解剖cpu
cpu由运算器, 控制器.寄存器组成
在cpu中:
运算器惊醒信息处理;寄存器惊醒信息存储;控制器控制各种器件进行处理
内部总线链接跟中器件,在他们之间进行数据的传送,
对于汇编来说,cpu中的主要部件是寄存器,寄存器是cpu中程序员可以用命令读写的部件.程序员通过改变各种寄存器中的内容来实现对cpu的控制.
通用寄存器
AX,BX,CX,DX
16位寄存器=高八位+低八位
AX=AH+AL;
BX=BH+BL;
CX=CH+CL;
DX=DH+DL;
mov搬移指令
mov ax,18 AX=18
add加指令
add ax,8 AX=AX+8
sub加指令
add ax,8 AX=AX-8
格式: sub/mov /add 寄存器,寄存器/立即数
操作对象的一致性
无论add 还是 mov必须严格的操作对象一致,如果相加超位,则舍弃超出位(c语言溢出概念)
物理地址
cpu访问内存单元时,要给出内存单元的地址.所哟没存构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中哦都有唯一的地址,我们将这个唯一的地址成为物理地址.
cpu通过地址总线送入存储器,必须是一个内存单元的物理地址.在cpu向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址.不同的cpu可以有不同 的形成物理地址的方式.
相当于我们在stm32中学到的基地址+偏移量
CS:IP承载着代码段地址和偏移地址
看下面两张图,
1cs为代码段寄存器,ip为指令指针寄存器他们指示了cpu当前要读取指令的地址.
2..我们写的每一个地址都是存在
3.我们通过地址加法器来组合地址逻辑,每一个物理地址的段地址与偏移地址都不是固定的
4.cs+ip的是我们实现对指令处理的基础, ip=段地址cs +ip+所读指令长度
5.执行指令,转到1.重复过程
jmp:(无条件跳转指令)
JMP 1000H | 段内直接转移,转移地址的偏移量由指令给出 |
JMP CX |
段内间接转移,转移地址的偏移量由CX指出
|
JMP 1000H:2000H |
段间直接转移,段码和偏移量由指令给出
|
JMP DWORD PTR [SI] | 段间间接转移转移地址在SI所指地址开始的4个单元中 |
(百度)
jmp可以强行改变 cs:ip读取的指令
1 锁定段地址 锁定偏移量读取指令
jmp 2AE3 :3; 执行后 CS=2AE3H,IP=OO3H处执行指令
2 锁定当前的段地址 锁定偏移量读取指令
jmp ax; 执行前 ax=1000H,CS-2000H,IP=0003H
执行后 ax=1000H,CS=2000H,IP=1000H
DS数据段地址(Data Segment)
DS用于存放要访问的数据的段地址
我们讲DS寄存器,不得不提一下cs:ip寄存器,先看一下例子哦
mov bx,1000H
mov ds,bx
mov al,[0]
第一句——BX = 1000H 将段寄存器 定格在1000H
第二句——DS = BX 将数据段寄存器等于代码段寄存器
第三句——将DS[0]处的值放入al中
先看[0]的意思是偏移地址为0 ,一般形式寄存器:[xxxxx](寄存器+偏移地址);如果 寄存器 缺省,则默认为DS段代码。
再看 整个代码的意思就将1000H处的数据放进al,我们将DS理解为一个渡口,负责将寄存器中的值拉到自己的船上,再将船上的值给对岸的变量。而这个渡口是必须的!!
这里注意一下
1. mov 指的是赋值并非地址意义上的的转移
2. 8086 CPU 不支持直接将一个数据送入段寄存器中 mov ds ,1000H是错误的
备注:在8086中 在数字后面加H表示十六进制
8086汇编中的栈
push 和 pop 出栈和入栈
入栈图push
出栈图pop
两张流程图诠释了栈的filo(先进后出)的模式,值得注意的是
1 push和pop的数据长度以字为单位(2个字节)
2 push 和 pop的操作对象可以是指令中的寄存器或内存单元
在push 和 pop 之后 就要要引出ss:sp概念(栈顶指针)
任意时刻ss:sp指向栈顶元素
上图
ss:sp是不是类似于cs:ip呢?
结合对[xxxx],ds,pop,push的概念体会下这个
原文:https://www.cnblogs.com/forup/p/12682913.html