CPU有三条总线:
地址、数据、控制线
地址总线确定存储单元
控制总线发送指令
数据总线:传输数据
CPU N个地址线 地址总线宽度为N 可以寻找2^N个内存单元
*存储单元
0开始编号,一个存储单元可以存储一个Byte
8086CPU有16根地址线
1bit就是一根地址线
存储器以B为最小单位
========================第二章 寄存器==========================
通用寄存器:
AX BX CX DX
AX ——> AH和AL
16位寄存器最大能存储的数 2^16 - 1 = 65536 - 1 转十六进制是四位 0~FFFFH
8 位寄存器 2^8 = 256 转十六进制 0~FFH
8086CPU在内部采用2个16位地址合成的方法来形成一个20位的物理地址
地址加法器:
物理地址 = 段地址 X 16 + 偏移地址
段地址 X 16 的说法是左移 4 位 一个X进制数左移1位,相当于乘以X
段地址 X 16 + 偏移地址 含义是: CPU 在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
起始、基础地址就是段地址
偏移地址16位,0~FFFFH, 64KB
*课后题:
(1)
CPU寻址范围 (0001H+ 0000H x 16 ) ~ (0001H+FFFFH x 16 ) = 0010H ~ 1000FH
(2)
SA * 16 + 偏移地址 = 2000H 偏移地址范围 0000H ~ FFFFH
SA * 16 = 2000H - 偏移地址
SA = 2000H / 10H SA = 10001H / 10H
段寄存器:
CS:代码段寄存器 IP:指令指针寄存器
8086中 CS的内容为M,IP的内存为N,CPU从 M*16 + N 开始读取指令执行。
CPU将CS:IP指向的内存单元中的内容看做指令,
-jmp指令:修改CS:IP中的值
jmp 段地址 : 偏移地址
jmp 2AE3:3 CS = 2AE3H IP = 0003H ,CPU将从2AE33H
"jmp 段地址 : 偏移地址" 指令的功能为 修改段地址CS 修改 偏移地址IP
仅修改IP 可以 "jmp 某合法寄存器"
例如:
jmp ax ,执行前 ax = 1000H CS = 2000H IP = 0003H
执行后 ax = 1000H CS = 2000H IP = 1000H
jmp ax 就类似于 mov IP,ax
8086CPU工作过程:
1 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
2 IP指向下一条指令
3 重复执行(跳转到1 IP+相应偏移位数)
============================实验==============================
数据存在内存2000:1F60单元中
数据存在内存的2000H段中的1F60单元中
R 查看改变CPU的值
R 1000H
D 查看内存中的内容
d 段地址:偏移地址 例如 d 1000:10
指定查看范围 d 1000:10 9 (查看9个内存单元)
E 改写内存中的内容
e 起始地址 数据 数据 数据
例如 e 1000:0 1 2 3 4 5 6 7 8
U 内存机器指令翻译成汇编指令
T 执行一条机器指令
A 以汇编格式在内存中写入一条机器指令
执行汇编程序步骤
1 T 先让CS:IP指向指令所在的内存单元
2 R 修改CS:IP中的内容
==============第三章寄存器=====================================
*内存中字存储
字节 是一个内存单元, 字 是2个连续的内存单元;
DS寄存器:存放要访问数据的段地址
如何将一个内存单元中的内容送入一个寄存器呢?
mov 寄存器名, 内存单元地址
mov指令如何从10000H中读取数据,
1000:0
1、先将1000H存入ds寄存器
2、mov al [0] 完成传送。0表示内存单元偏移地址是0 段地址默认放在 ds寄存器
*栈
SS:段寄存器 SP:偏移寄存器
SS:SP指向栈顶元素
解释 push ax 指令:
1、SP = SP - 2 SS:SP指向当前栈顶前面的元素,以此为新栈顶
2、ax 的内容送入SS:SP指向的内存单元处。SS:SP指向新栈顶
人话来说就是:先移动栈顶指针 在把数据送入栈顶指针指向的内存单元处。
解释 pop ax 指令:
1、SS:SP指向的内存单元的内容送入ax中
2、SP = SP + 2 SS:SP指向当前栈下面的元素,以当前栈顶下面的单元为新的栈顶。
先将栈顶指针的内容送入ax寄存器中,在向下移动栈顶指针。
pop和push指令格式
pop 段寄存器 push 段寄存器
pop 寄存器 push 寄存器
pop 内存单元 push 内存单元
============第一个汇编程序========================
伪指令
segment //段开始
代码段。。。
ends //段结束
end //汇编程序结束标记
assume :假设某一段寄存器和程序中某一segment...ends定义的段相关联
怎么写一个汇编程序呢?
1、定义一个段
demo segment
mov ax 1000FH
demo ends
end
程序返回指令:
mov ax,4c00H
int 21H
*[bx] 表示:一个内存单元,它的偏移地址在bx中。
mov ax,[bx]
//将一个内存单元的内容送入到ax,这个内存单元的长度为2字节,存放一个字,偏移地址在bx中,段地址在ds中。
inc bx
// bx中的内容加1 类似于 bx 自增
LOOP指令 循环指令
格式:loop 标号
cpu执行loop指令时会 cs- - ;判断cs中的值,不为0转至标号处执行程序,为0向下执行。
demo segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov 4c00H
int 21H
demo ends
end
loop写循环格式
mov cx 循环次数
s:
要循环的代码
loop s
例题:
加法计算 123*236,结果存在ax中
adds segment
mov ax,0
mov cx,236
s: add ax,123
loop s
mov 4c00H
int 21H
adds ends
end
dw 定义字节型变量,1个字数据占2个字节单元,读完一个,偏移量 + 1