第一、二章
基础知识
一个存储单元一般存储 1个字节,也就是8个二进制位
一个字为两个字节
地址总线:用来寻址,由于一根地址总线只能表示2个状态,所以一个CPU有N根地址线,则可以说这个CPU的地址总线宽度为N,这样的CPU最多可以寻找 $2^{N}$ 个内存单元
数据总线:数据总线的宽度意味着CPU一次能传输多少位数据
控制总线:控制总线的宽度决定了CPU对外部器件的控制能力
寄存器
通用寄存器中,AX可以拆分为 AH和AL,如果单独使用AH或者AL,则应该看成一个独立的8位寄存器来使用,AH和AL此时是不相关的
如何寻址?
注意此时并不是操作系统中学到的分段,只是这么用罢了
一个 ‘段’ 的偏移占16位,那么一个段的长度最大为64KB
不同的段地址和偏移地址可以形成同一个物理地址
CS:IP 指向的内容就是将要执行的指令(但是CPU是怎么知道指令的长度的呢,x86是变长的,而MIPS是等长的,这个坑之后说)
基础指令 mov,add,jmp
mov指令设置寄存器的内容值,add执行加法,jmp设置cs和ip的值
四条指令完成计算2的4次方
mov ax,2 |
当然也可以使用jmp指令,但是你无法判定程序什么时候退出(因为指令不够hhhh)
dosbox使用
dosbox可以用来模拟dos环境,然后我们下载一个MASM工具包,里面包含了 debug
这些程序
注意设置dosbox
[autoexec] |
因为我的 MASM 工具包位于 G盘目录下,所以设置挂载命令
这样打开dosbox之后自动挂载
实验一
debug.exe 使用
r 命令可以查看寄存器内容,以及当前的 cs:ip 指向,还有ds指向的内容
还可以修改寄存器的内容
使用d命令查看内存
d1000:9
查看某一个范围内的内存
d1000:9 20
e 命令可以修改内存的数据
e1000:0 0 1 2 3 4 5 7 8
当然也可以换一种方式修改
也可以向其中写入字符串
尝试写入一段汇编指令
使用 e命令编辑内存,然后使用 u 命令反汇编
那么如何执行汇编指令呢?
首先用 r 设置 cs 和 ip的值,然后使用 t 就可以执行汇编指令了,可以看到执行了三条汇编指令后的结果, ax 存储了 0x03 cx 存储了 0x02
直接使用 e 命令编辑当然不方便,于是可以用 a 命令直接书写汇编指令,然后自动的给转化成对应的机器码
实验任务
- 使用debug将下面的程序写入内存,逐条执行
汇编指令输入到内存中
然后运行就是的了
- 将下面3条指令写入到 2000:0 开始的内存单元中,计算2的次方
mov ax,1 |
运行过程截图
- PC 机主板上的ROM有一个生产日期,在内存 FFF00H~FFFFFH 的某几个单元中,请找到这个生产日期并试图改变它
很显然我是改不了的