2023操作系统 |
您所在的位置:网站首页 › pc寄存器的值 › 2023操作系统 |
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中断.试想你自己拥有这样一台电脑能干啥? 估计啥都干不了. 是个进博物馆的物件, 不过它却在我们计算机专业同学学习汇编, 了解计算机运作原理,非常有用. 这么看它也就是个实验学习用一用. 不过我们学习汇编语言, 一般基于MS-Dos系统. 所以以后不要说自己没用过dos系统. 我们很多同学直到学完汇编,都不知道自己在什么系统上模拟操作的, 还以为自己直接在操作8086cpu呢. 在dos系统上跑一些汇编调试器debug.exe 执行器masm.exe链接器link.exe等 . CPU把所有外设统一看做存储器,并统一编地址. 方便统一读写. 认识一下8086cpu 有很多针脚. 我们关注的NMI INTR两个针脚, 因为它和中断有关系 没这么简单, 为了支持更多的中断类型, 加了个中间商, 中断控制器. 8086cpu中断向量表如下 启动后内存布局如下 在通电开机的一瞬间,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 debug8086 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把它区分为了代码段数据段. 调试模式下(目的: 熟悉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 //弹出栈顶,存入ax3.了解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 demo8086内存布局参考: https://www.pianshen.com/article/51731994221/ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |