汇编语言读书笔记(一)
关于本次阅读后的思考
第一章
1 什么是汇编语言? 为了人们能够简易的编写机器语言而设计的,其编译指令与机器语言一一对应
2 什么是内存? 内存实际是存放8位字节的容器,并从0开始编号。
3 CPU执行的数据来自哪里? CPU的执行数据从内存中获取。 地址总线是CPU与内存的连接桥梁,所以地址总线的宽度也就决定了CPU能访问的最大内存地址数
4 CPU的数据总线,控制总线作用? 数据总线决定了CPU的传输速度,控制总线决定了CPU的控制能力
5 CPU获取数据流程? 控制指令+内存地址通过对应的总线连接到内存,然后通过数据总线返回或者送出数据到内存或者CPU
第二章
1 CPU结构和运行简单概要
2 汇编语言的DEBUG简单应用
1 CPU的组成? 寄存器,运算器,控制器,总线
2 指令地址的运算? 代码段寄存器CS存放地址段,指令寄存器IP存放偏移地址,两者通过地址加法器计算出需要指向的指令的内存地址 地址=地址段X16+偏移地址
3 CPU获取数据并执行的流程? CS+IP数据--->地址计算器--->输入输出控制-->内存 内存中获取指令--->输入输出控制---->指令缓冲器--->执行指令--->改写IP指向下一个指令--->重复执行
第一章 基础知识
1 汇编的产生
便于识别和记忆
流程:汇编指令---->编译器----->机器码---->计算机
2 汇编的指令
1 汇编指令:有对应机器码(核心)
2 伪指令:编译器执行,机器不执行,无对应机器码
3 其他符号: 例如+-*/ 编译器识别,无对应机器码
3 指令和数据的关系
1 指令和数据在内存和磁盘上无区别,都是二进制的数据而已
1000100111011000
可以看出是89D8H(数据)也可以看出是指令mov ax,bx(指令)
4 CPU读写内存
1 需要内存地址(地址信息)
2 读写指令(控制信息)
3 读写数据(数据信息)
4 总线--逻辑上分为地址总线、控制总线、数据总线
CPU通过地址总线发送储存器单元编号3给内存芯片同时通过控制总线发送读取指令,存储器将3号单元的数据21通过数据总线送入CPU。
地址总线的数量(宽度)决定了CPU最大的逻辑寻址的地址范围,例如10根地址总线 1111111111 的最大范围是0到2的10次方-1 的地址范围。
数据总线的数量(宽度)决定了CPU的传输速度,例如8根可以一次传送1个字节(0X89D8属于2个字节就需要分2次传送-D8-89),16根一次可以传送2个字节。
控制总线的数量(宽度)意味着CPU可以对外部硬件有多少种控制
储存器:
1分为随机储存器(RAM)可读可写、 只读储存器(ROM)只能读不能写并对应配套有主板和接口厂商提供的的BIOS系统
2 每个储存器都是分开的,分段的地址空间,由CPU控制
小结:
1 每个CPU对应不同的汇编指令集
2 汇编指令是机器指令的翻译,并且一一对应
3 CPU的可以直接使用的信息在内存里存放(内存编号从0开始编),且数据都是二进制,无指令和数据之分
4 地址总线的宽度-CPU寻址能力;数据总线的宽度-CPU传输速度;控制总线的宽度-CPU控制能力;
5 不同的储存器的地址空间是连续的并分段的1-10,11-20,21-30,例如主存储地址段,显卡内存地址段等
个人理解:
1 什么是汇编语言? 为了人们能够简易的编写机器语言而设计的,其编译指令与机器语言一一对应
2 什么是内存? 内存实际是存放8位字节的容器,并从0开始编号。
3 CPU的执行的数据来自哪里? CPU的执行数据从内存中获取。 地址总线是CPU与内存的连接桥梁,所以地址总线的宽度也就决定了CPU能访问的最大内存地址数
4 CPU的数据总线,控制总线作用? 数据总线决定了CPU的传输速度,控制总线决定了CPU的控制方式
5 CPU获取数据流程? 控制指令+内存地址通过对应的总线连接到内存,然后通过数据总线返回或者送出数据到内存或者CPU
第二章 寄存器
CPU的构成
运算器进行信息处理
寄存器进行信息储存 不同的CPU,寄存器的数量是不一样的
控制器进行控制各种硬件的工作
内部总线连接各种硬件,传送数据
寄存器
通用寄存器 ,例如8086的CPU的寄存器都是16位寄存器,可以存放2个字节AX,BX,CX,DX。
兼容之前的8位寄存器AX划分为AH,AL.BX划分为BH,BL
汇编指令
mov ax,18 把18送入寄存器AX里
add ax,19 寄存器AX中的值+19
mov ax,bx 把寄存器BX的值送入AX中
16位的CPU结构
1 一次可以运算16位数据的运算器
2 寄存器最大宽度为16位
3 寄存器和运算器之间的通路是16位
4 CPU寻址是20位
问题
为什么CPU寻址是20位?不是16位呢,因为CPU只能处理和输出16位的地址
答案:通过地址加法器 地址=段地址X16+偏移地址
段寄存器
CS IP
CS为代码段寄存器(存放段地址)
IP为代码指针寄存器(存放偏移地址)
假设CS的值为M IP的值为N则CPU执行指令从内存的M*16+N开始读取一条指令执行
1 CS:IP定位 段地址和偏移地址 例如CS=2000 IP=1
2 通过地址计算器得到20001
3 进入输入输出电路找到20001的地址读取数据(指令)
4 读取的数据和指令都通过输入输出电路送到指令缓冲器然后被指令执行器执行并更新IP的值IP=1+3(ip+=指令的Byte长度)
5 重复1步骤
修改CS IP的指令
全部修改
jmp 段地址:偏移地址
jmp 2AE3:0b16 执行结果等价于 CS=2AE3H IP=0B16H
只修改IP
jmp ax 执行结果等价于 把AX的值送入IP中
jmp bx 执行结果等价于 把BX的值送入IP中
Debug 工具的使用
-R查看、改变CPU寄存器的内容
-D查看内存的内容--- 一次显示128个字节
-E改写内存内容
-U内存的机器指令翻译成汇编指令
-T执行一条机器指令
-A以汇编格式在内存中写入一条机器指令
-Q退出
实验
1 -R查看寄存器当前所指向的内存地址---看到AX = BX =0000 CS=0B38 IP=0100
2 -D查看1000:0000的地址的内容
3 -A以汇编方式写入1000:0000地址
4 -u查看写入的数据
5 -rcs rip改写指向的内存地址
6 -t 指向CS:IP的指向的指令
小结
1 代码段地址在代码段寄存器中存放CS存放段地址IP存放偏移地址
步骤A CPU从CS:IP指向的内存单元读取指令,读取的数据(指令)写入指令缓冲器
B IP指向下一条指令
2 debug的使用
-R查看、改变CPU寄存器的内容
-D查看内存的内容--- 一次显示128个字节
-E改写内存内容
-U内存的机器指令翻译成汇编指令
-T执行一条机器指令
-A以汇编格式在内存中写入一条机器指令
-Q退出
3 简单的汇编指令 add,mov,jmp
个人理解
1 CPU的组成? 寄存器,运算器,控制器,总线
2 地址的运算? 代码段寄存器CS存放地址段,指令寄存器IP存放偏移地址,两者通过地址加法器计算出需要指向的内存地址 地址=地址段X16+偏移地址
3 CPU获取数据并执行的流程? CS+IP数据--->地址计算器--->输入输出控制-->内存 内存中获取指令--->输入输出控制---->指令缓冲器--->执行指令--->改写IP指向下一个指令--->重复执行