主要跟小甲鱼老师的视频和王爽老师的书学习汇编,膜拜小甲鱼老师。
第一章 基础:
寄存器:cup里的存储器,存放指令和数据。
存储器:存放指令和数据。硬盘和内存都是存储器。
存储单元(从0开始)
总线:
地址总线:寻址能力,(64位与32位区别)n根地址(一根1个字节=1个内存单元)
控制总线:cpu对外界器件的控制
数据总线:决定cpu和外界数据传送速度
主板:核心器件
接口:cpu不直接控制外部器件,通过接口卡控制
存储器:
随机存储器(ram):
只读储存器(rom):每种硬件有自己的rom
另:1.不同cpu有不同指令集
2.不同总线来区别二进制数据是什么
3.cpu看到的是逻辑存储器
检测点暴露的问题:
1.B:字节=8b:位
2.一根地址总线对应1B的寻址能力,一根数据总线对应1bit的数据
第二章 寄存器:(8086cpu)
cpu:内部总线连接
运算器:一次最多处理16位
控制器:
寄存器: 最大宽度16位(数据最大值2的16次方-1)
通用寄存器:4个寄存器(AX,BX,CX,DX)可以分为两个独立的8位寄存器。
高位:H,低位:L
字(word)=2个字节(16位兼容两个8位)
例:mov ax,bx 把bx移进ax(支持寄存器,段寄存器,数据,内存到寄存器,寄存器到段寄存器,寄存器到内存)(数据到寄存器sp等)
add ax,bx 把bx加进ax
物理地址:内存单元的唯一地址
8086内部16位与外部20位冲突解决方法:内部用两个16位合成一个20位(段地址+偏移地址)物理地址=段地址*16(二进制左移4位,16进制左移1位)+偏移地址
段:段的划分来自cpu,内存并没有分段,看需要自己看成不同段
段寄存器(不要忘记*16):
CS(代码段地址):CS*16+IP(代码偏移地址) ip=ip+读取的指令长度
修改CS:ip方法:jmp 段地址:偏移地址 jmp ax是令ip=ax
cs+ip决定执行与否,指向则执行,不指向则不执行。
DS(数据段地址):当前操作的数据可以[偏移地址]的方式引用
SS(栈寄存器):SS:sp指向栈顶元素(压入sp-,推出sp+)(先动数据)
sp指向栈的最高地址上一位。(格式化只是移指针)(栈空时指到栈外(+2))
ES:(备用段寄存器)
另:1.汇编指令不区分大小写
2.从后向前运算
3.超出位进到其他寄存器(分高低位时高低位之间也无法直接进位:add al,88)
4.cpu访问内存必须要物理地址
5.段地址和偏移地址可以指示2的16次方个内存单元
检测点暴露的问题:
1.不加H表示10进制,需要先转换为16进制;
2.注意区分mov 和add;
3.sub ax,bx 把ax减去bx;
dosbox的一些操作: (加不加空格都行)
1.r 查看、改变cpu寄存器内容 r 寄存器(改变寄存器的值为指定值)
2.d 查看内存中的内容 d 段地址:偏移地址 n-1(查看该地址开始的n(默认128)个内存单元)
3.e 改写内存中的内容 e 起始地址 数据 数据。。。
4.u 将机器指令翻译为汇编指令
5.t 执行一条机器指令
6.a 以汇编格式写入机器指令(执行汇编) a 起始地址(从起始地址开始写入)
7.p 执行到当前行,有循环则全部执行
8.q退出dubug
9.g 执行到某地址;like 断点
第三章 寄存器(内存):
字的存储:分进高字节中(低字节中存不下的存进高字节)
栈:后入先出
push ax:把ax元素压进栈中 push [0]把0的数据压入栈
pop ax:把栈顶推到ax中 pop [0]把数据推到0
push和pop指令可以修改寄存器和内存
栈顶越界问题:向上越界和向下越界
另:1.mov指令访问内存时可以只给出偏移地址(默认ds)
2.可以用段寄存器表示段地址
3.debug的t命令在执行修改SS的指令时,下一条指令也紧接着被执行
检测点暴露的问题:
1.movadd操作的数据量和使用的寄存器有关,相应大小的寄存器调动相应的数据。
2.e d a命令都是操作内存的,r是直接操作寄存器的。
3.使用栈时先设定SS:sp(最高位)