汇编笔记[01]
背景
汇编语言是计算机绕不开的一个语言,非常重要,开始学习。
总线
地址总线
- CPU是通过地址总线来指定存储单元的
- 地址总线宽度,决定了可寻址的存储单元大小
- N根地址总线(宽度为N),对应寻址控件2的n次方。
数据总线
- CPU于内存或其它器件之间的数据传送是通过数据总线来进行的。
- 数据总线的宽度决定了CPU和外界的数据传送速度。
- 例:向内存中写入数据89D8H时的数据传送。
控制总线
- CPU通过控制总线对外部器件进行控制。
- 控制总线是一些不同控制线的集合。
- 控制总线宽度决定了CPU对外部器件的控制能力。
CPU对存储器的读写
什么是内存地址空间
CPU地址总线宽度为N,寻址空间为
2
N
2^N
2NB
8086 CPU的地址总线宽度为20,那么可以寻址1MB个内存单元,其内存地址空间为1MB。
RAM:随机存储器,能读能写,但是掉电数据丢失
例如:主板上的TAM
扩展槽上的RAM(例显卡)
ROM:只读存储器,能读不能写,
系统BIOS
接口卡上的BIOS
选择8086学习的理由
- 简单
- 达成目标:
理解计算机底层工作原理
作为继续扩展的基础 -> 80x86汇编、Linux汇编、ARM汇编
学习工具-DOS模拟器
http://www.dosbox.com
挂载
mount c d:\learn\masm
c:
CPU的组成
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器协调各种器件进行工作
- 内部总线实现CPU内各个器件之前的联系。
汇编指令学习
汇编指令 | 控制CPU弯沉的操作 | 用高级语言的语法描述 |
---|---|---|
mov ax,18 | 将18送入AX | AX = 18 |
mov ah,78 | 将78送入AH | AH = 78 |
add ax,8 | 将寄存器AX中的数值加上8 | AX = AX + 8 |
mov ax,bx | 将寄存器BX中的数据送入寄存器AX | AX = BX |
add ax,bx | 将AX,BX中的内容相加,结果存在AX中 | AX = AX + BX |
注:汇编指令不区分大小写
8086CPU访问地址为123C8H的内存单元
方法:物理地址 = 段地址 * 16 + 便宜地址
本质含义:相当于段地址左右4位(2进制)/左移一位(16进制)
要解决的问题
用两个16位的地址(段地址、偏移地址),相加得到一个20位的物理地址。
用分段的方式管理内存
内存本身并没有分段,段的划分来自于CPU!!!
段地址很重要!-- 用专门的寄存器存放段地址。
4个段寄存器:
CS-代码段寄存器
DS-数据段寄存器
SS-栈段寄存器
ES-附加段寄存器
Debug能做什么
-
用R命令查看、改变CPU寄存器的内容
-
用D命令查看内存中指定地址的内容
-
用E命令改变内存中的内容
-
用U命令将内存中的机器指令翻译成汇编指令(查看代码)
-
用A命令以汇编指令的格式在内存中写入机器指令
-
用T命令执行机器指令
用U命令将内存中的机器指令翻译成汇编指令
-
有汇编指令
mov ax,0123H
mov bx,0003H
mov ax,bx
add ax,bx -
对应的机器码为
B8 23 01
BB 03 00
89 D8
01 D8 -
e地址 数据-写入
-
d地址-查看
-
u地址-查看代码
-
t-执行CS:IP处的指令
mov ax,0123H
mov bx,0003H
mov ax,bx
add ax,bx- q 退出Debug
两个关键的寄存器
- CS:代码段寄存器
- IP:指令指针寄存器
- CS:IP:CPU将内存中CS:IP指向的内容当做指令执行。
8086PC工作过程的简要描述:
1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
2)IP = IP + 所读指令的长度,从而指向下一条指令;
3)执行指令。转到步骤(1),重复这个过程
跳转指令
修改CS、IP的指令
- 事实:执行何处的指令,取决于CS:IP(指向的物理地址处)
- 应用:可以通过改变CS、IP中的内容,来控制CPU要执行的目标指令
- 问题:如何改变CS、IP的值
- 方法1:debug 中的R命令可以改变寄存器的值–rcs,ip
Debug是调试手段,并非程序方式! - 方法2:用指令修改
不可以 - 方法3:转移指令jmp
转移指令jmp
- 同时修改CS、IP的内容
jmp 段地址:偏移地址
jmp 2AE3:3
jmp 3:0B16
功能:用指令中给出的段地址修改CS。偏移地址修改IP - 仅修改IP的内容
jmp 某一合法寄存器
jmp ax (类似于 mov IP,ax)
jmp bx
功能:用寄存器中的值修改IP。