一些概念
SRAM:静态随机访问存储。0或1一旦写入就会一直在那多用在寄存器,访问速度很快。cpu里也就百来个,kb级别
enable开关闭合时write才能写入数据。
DRAM:动态随机访问存储。如果要保持1或0就要一直刷新
开关闭合后会给电容充电,但会慢慢减少。(高中物理)
刷新:定期给电容充电,output会持续输出1
选择器:n根线组成的选择器能保存个地址
寄存器组:8个寄存器单元+1个3线选择器。分为CS(代码寄存器)和DS(数据寄存器)
解码器:一个可以判断一条机器语言(高低电平)的电路,例如这里输入0001则会输出1
冯诺依曼架构
ABCD为寄存器,
V为ALU(加法器),接受2个输入,每个输入1个字节。
IC给指令计数的专用寄存器
IP用来存储指令地址的专用寄存器
启动过程:BIOS执行POST(上电自检),在硬盘MBR分区寻找bootloader,找到就加载到内存0x07c00
汇编
语法
mov
mov 目的操作数, 源操作数
- 目的和源可以是:通用寄存器、段寄存器、内存单元和立即数
- 源操作数和目的操作数的位宽必须一致
- byte、word、dword、qword:分别对应字节、单字、双字、四字()
- 从内存往寄存器mov会自动适应,但寄存器往寄存器mov就要注意位宽
- mov涉及内存访问的都是逻辑地址,而非物理地址 | 👇源 | 👉目的 | 通用寄存器 | 段寄存器 | 内存单元 | 立即数 | | —- | —- | —- | —- | —- | | 通用寄存器 | 可以 | 可以 | 可以 | 不可以 | | 段寄存器 | 可以 | 不可以 | 可以 | 不可以 | | 内存单元 | 可以 | 可以 | 不可以 | 不可以 | | 立即数 | 可以 | 不可以 | 可以 | 不可以 |
在这里,cs存放代码段开始地址。ds存放数据段开始地址
源操作数 | 目的操作数 | 备注 |
---|---|---|
立即数 | 内存单元 | 宽度对号与立即数一致 |
PS:intel 8086有8个寄存器:ax,bx,cx,dx,si,di,bp,sp,而前四个都可以拆开成两个8位寄存器来用,如AX=AH+AL
;在屏幕显示信息
mov ax, 0b800h ;将ax里的内容存入0b800h
mov ds, ax ;指定数据段基准地址
;以上两行就是说将数据段寄存器ds的值设置为0b800h
mov byte [0x00],'2' ;byte指定传送数据大小为1字节,0x00是相对于ds的偏移地址
jmp $ ;跳转到jmp所在位置,$指标定当前位置,目的是间接修改IP
times 510-($-$$) db 0 ; MBR分区是512字节,从$到0x55之间补满0。512-2个字节(55和aa)=510
;$$代表程序起始位置,$代表当前地址
db 0x55,0xaa
BootLoader
MBR
有严格的结构。在HDD里存储在0柱面0磁道1扇区,占用512字节。BIOS会从0面0道1扇区寻找MBR