2023操作系统

您所在的位置:网站首页 pc寄存器的值 2023操作系统

2023操作系统

2023-04-18 12:31| 来源: 网络整理| 查看: 265

1988 Amstrad PC 8086 Windows 3.0 Test观看

8086是一款经典的16位微处理器,是Intel公司推出的第一款16位处理器

感性的认识一下它

cpu: 是一个16位的cpu, 14个16(2byte)位的寄存器.mem: 最大支持1M内存,因为它有20条地址总线,2的20次方是1M.这么小, 如果你侥幸买到一个这样的电脑,那它能安装什么系统? MS-DOS/Windows 1.0,2.0,3.0/linux不过对其它硬件有各种要求.中断系统:8086具有强大的中断系统,支持多级中断、中断向量表等功能。了解这个便于我们后面深入了解linux中断.

试想你自己拥有这样一台电脑能干啥? 估计啥都干不了. 是个进博物馆的物件, 不过它却在我们计算机专业同学学习汇编, 了解计算机运作原理,非常有用. 这么看它也就是个实验学习用一用.

DosBox模拟器可以看做这么几层

不过我们学习汇编语言, 一般基于MS-Dos系统. 所以以后不要说自己没用过dos系统. 我们很多同学直到学完汇编,都不知道自己在什么系统上模拟操作的, 还以为自己直接在操作8086cpu呢.

在dos系统上跑一些汇编调试器debug.exe 执行器masm.exe链接器link.exe等 .

CPU把所有外设统一看做存储器,并统一编地址. 方便统一读写.

其实说是支持1M内存条, 实际常说的内存条DRAM只支持640K. 文章下面有个内存分布,也可以看看bios在哪儿

认识一下8086cpu

有很多针脚. 我们关注的NMI INTR两个针脚, 因为它和中断有关系

没这么简单, 为了支持更多的中断类型, 加了个中间商, 中断控制器.

8086cpu中断向量表如下

启动后内存布局如下

实模式下0x00000~0x9FFFF这最低的640KB的地址空间范围,对应DRAM.0xF0000~0xFFFFF这64KB的内存对应的就是ROM BIOS

在通电开机的一瞬间,cpu的cs:ip寄存器,被硬件强制初始化为0xF000:0XFFF0。初始化完成后,cpu讲开始计算并跳转到cs寄存器保存的真实物理地址处执行第一条指令。

(实模式下 真实物理地址 = 段基址 * 16 + 偏移地址)

详细启动流程参考

以上如果你对中断机制百思不得其解, 或许学完汇编很可能就会了解.

8086汇编中断流程通常包括以下步骤:

中断发生:当外部设备发生一个中断请求时,它会发送一个中断信号给CPU,通知CPU需要停止当前正在执行的程序,转而去执行中断处理程序。保存当前状态:CPU会自动将当前正在执行的指令的地址、标志寄存器和其他相关寄存器的值保存到堆栈中。这些值保存在堆栈中是为了当中断处理程序执行完毕后,能够恢复到原来的状态。确定中断向量:中断处理程序的地址被保存在中断向量表中,CPU会根据中断请求的类型(硬件或软件中断)和中断号来确定中断向量。中断向量是一个指向中断处理程序的地址。跳转到中断处理程序:CPU会使用中断向量来跳转到中断处理程序的起始地址。中断处理程序会执行所需的操作,如响应外设的请求、保存当前状态、设置新的状态等。中断处理程序结束:当中断处理程序执行完毕后,CPU会从堆栈中恢复之前保存的状态,然后继续执行被中断的程序。

以上就是8086汇编中断流程的基本步骤。中断处理程序是响应外部事件的重要手段,可用于实现操作系统、设备驱动程序和其他系统软件的各种功能。

好了, 了解硬件和它的特点其实口水小王子, 重点还是理解建立在上面的逻辑. 下面就开始写一些汇编, 反过来在了解它的内部工作机制.

安装dosbox(ms-dos系统下使用debug工具来写调试汇编.)

1.dosbox https://www.dosbox.com/download.php ​ 2.编译器masm分享(debug/masm/link): 链接: https://pan.baidu.com/s/1RbGjhnFSOT2zQCom8OP_Cw 提取码: p6uu mount c: ~/masm5 c: dir debugAX:Accumulator,累加器寄存器BX:Base,基址寄存器CX:Counter,计数器寄存器DX:Data,数据寄存器SI:Source Index,源地址指针寄存器DI:Destination Index,目的地址指针寄存器BP:Base Pointer,基址指针寄存器SP:Stack Pointer,堆栈指针寄存器IP:Instruction Pointer,指令指针寄存器FLAGS:标志寄存器

8086 CPU 有 14 个寄存器。除了前面提到的通用寄存器 AX、BX、CX、DX、SI、DI、BP、SP 和指令指针寄存器 IP、标志寄存器 FLAGS 之外,还有段寄存器 CS、DS、SS 和 ES。

这些段寄存器的含义如下:

CS:代码段寄存器,存储当前代码段的基地址。DS:数据段寄存器,存储当前数据段的基地址。SS:堆栈段寄存器,存储当前堆栈段的基地址。ES:附加段寄存器,可以用于存储另外一个数据段的基地址,用于存储数据。

这些寄存器在程序执行期间会被CPU自动使用和更新,对于编写汇编语言程序来说,熟练使用这些寄存器是非常重要的。

1.了解8086 cpu

仅支持1M内存, 20bit地址线(但数据线/控制线是16bit) 2^20 = 1048576 = 1M内存以字存储,1格代表1byte=8bit寄存器能存2个字节(高8bit,低8bit), 14个寄存器,4个通用ss:sp 栈 cs:ip 代码段 ds:[0] 数据段

搞清楚这几个寄存器, 就会清楚内存在cpu眼中,哪一段是代码段, 哪一段是数据段, 也就是内存是cpu把它区分为了代码段数据段.

寄存器如何赋值? mov ax,1234 //立即数写入寄存器 mov ax,[0] //从内存区域读值到寄存器 mov ax,bx //ax内存写入到bx

调试模式下(目的: 熟悉dosbox下debug提供指令的使用):

给内存块赋值? mov [0],bx 如何写入一段代码? d 2000:0 查看写入的代码 u 2000:0 查看写入的代码a 2000:0 寄存器之间赋值 mov ax,bx

调试模式如何如何写入数据?

e 2000:0 11 22 33 B8 23 01 BB 03 00 89 D8 01 D8 mov ax,0123 mov bx,0003 mov ax,bx add ax,bx

了解8086真机启动? https://blog.csdn.net/qq_29768025/article/details/125435649 改cs:ip指向bios地址(自检/建立中断向量表) mbr(grub)

2.了解如何管理内存

基地址: 偏移地址 数据段: ds:[0] mov ax,[0] //内存数据(ds值为基地址)到寄存器 mov ah,[0] //内存数据到寄存器高地址 代码段: cs:ip jmp 2000:0 //同时修改cs:ip jmp 10 //仅修改ip 栈: ss:sp push ax //ax的内存入栈 pop ax //弹出栈顶,存入ax

3.了解dosbox使用

? 寻求帮助 r rax 直接赋值 d 2000:0 dump查看内存内容,16进制 u 2000:9 unasm,查看内存内容,代码 e 写数据 a 写指令(回车) t trace,执行指令(从cs:ip处开始)

4.例子 交换两个寄存器的值(目的熟悉汇编指令)

依旧调试模式来执行

先初始化一下地址: 1000:0 23 11 22 66 mov bx,1000 mov ds,bx mov bx,1001 mov ss,bx mov sp,10H mov ax,[0] mov bx,[2] push ax push bx pop ax pop bx mov [0],ax mov [2],bx

写一个demo.asm文件, 我们打算用编译器连接器来执行, 编译汇编文件 demo.asm

assume cs:codesg codesg segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h codesg ends end

masm demo.asm; link demo; demo.exe demo

8086内存布局参考: https://www.pianshen.com/article/51731994221/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3