开发第三天(Day 03)

news2024/11/19 16:35:31

首先对ipl.nas进行修改:

; haribote-ipl
; TAB=4

        ORG     0x7c00          ; 这个程序被读入哪里

; 以下是标准FAT12格式软盘的描述

        JMP     entry
        DB      0x90
        DB      "HARIBOTE"      ; 可以自由地写引导扇区的名字 (8字节)
        DW      512             ; 1扇区的大小 (必须是512字节)
        DB      1               ; 簇的大小 (必须是一个扇区)
        DW      1               ; FAT从哪里开始 (一般从第1扇区开始)
        DB      2               ; FAT的个数 (必须是2)
        DW      224             ; 根目录的大小(一般为224个项)
        DW      2880            ; 这个磁盘驱动器的大小 (必须是2880扇区)
        DB      0xf0            ; 磁盘类型
        DW      9               ; FAT的长度(必须是9个扇区)
        DW      18              ; 1个磁道有几个扇区 (必须是18)
        DW      2               ; 磁头数(必须是2)
        DD      0               ; 因为没有使用分区,所以这里一定是0
        DD      2880            ; 重写一次磁盘大小
        DB      0,0,0x29        ; (不太清楚)
        DD      0xffffffff      ; 可能是卷标号码
        DB      "HARIBOTEOS "   ; 磁盘的名称 (11字节)
        DB      "FAT12   "      ; 格式的名称 (8字节)
        RESB    18              ; 先空出18个字节

; 程序主体

entry:
        MOV     AX,0            ; 寄存器初始化
        MOV     SS,AX
        MOV     SP,0x7c00
        MOV     DS,AX

; 阅读光盘

        MOV     AX,0x0820
        MOV     ES,AX
        MOV     CH,0            ; 柱面0
        MOV     DH,0            ; 磁头0
        MOV     CL,2            ; 扇区2

        MOV     AH,0x02         ; AH=0x02: 读盘
        MOV     AL,1            ; 1个扇区 
        MOV     BX,0
        MOV     DL,0x00         ; A驱动器
        INT     0x13            ; 调用磁盘BIOS
        JC      error           

; 虽然读完了,但是因为没什么要做的所以睡觉

fin:
        HIL                     ; 让CPU处于休眠,等待指令
        JMP     fin             ; 无限循环

error:
        MOV     SI,msg
putloop:
        MOV     AL,[SI]
        ADD     SI,1            ; SI加1
        CMP     AL,0            
        JE      fin             
        MOV     AH,0x0e         ; 显示一个文字
        MOV     BX,15           ; 指定字符颜色
        INT     0x10            ; 调用显卡BIOS
        JMP     putloop
msg:
        DB      0x0a,0x0a       ; 两个换行
        DB      "load error"    
        DB      0x0a            ; 一个换行
        DB      0
        RESB    0x7dfe-$        ; 填写0x00,直到0x7dfe
        DB      0x55,0xaa

所谓的JC是指,当进位标志是1的时候就跳转

磁盘读、写、扇区校验、寻道:
AH=0x02; —— 读盘
AH=0x03; —— 写盘
AH=0x04; —— 校验
AH=0x0c; —— 寻道
AL=处理对象的扇区数(只能处理连续的扇区)
CH=柱面号&0xff;
CL=扇区号(0-5位)|(柱面号&0x300)>>2
DH=磁头号
DL=驱动器号
ES:BX=缓冲地址(校验及寻道时不使用)
返回值:
FLACS.CF0: 没有错误,AH0
FLACS.CF==1: 有错误,错误号码存入AH内(与重置功能一样)

以下这几个寄存器:
CH对应柱面号;
CL对应扇区号;
DH对应磁头号
DL对应驱动器号
在上面的程序中,柱面号是0,磁头号是0,扇区号是2,磁盘号是2

本书提供的软盘示意图:
在这里插入图片描述
虽说,软盘现在已被淘汰。但在这里还是记一下:
1张软盘有80个柱面,2个磁头,18个扇区,且一个扇区有512个字节

缓冲区地址:这是一个内存地址,表明我们要把从软盘上读出的数据装载到内存中的哪个位置。

但是问题在于,用一个寄存器来表示内存地址显然不够,BX作为16位寄存器,最大才64K。在设计BIOS的时代CPU甚至没有32位寄存器,人们只好设计了起辅助作用的段寄存器,用于协助指定内存地址,在使用的时候,以ES:BX这种方式来表示地址

[ES:BX] 代表了ES*16+BX的内存地址

不管我们要指定内存的什么地址,都必须同时指定段寄存器,一般如果省略的话就会把“DS:“作为默认的段寄存器。就比如说,以前我们用的"MOV CX,[1234]” ,其实是"MOV CX,[DS:1234]"的意思。而"MOV AL,[SI]"也就是"MOV AL,[DS:SI]"的意思。在汇编语言中,如果每日会都这么写就太麻烦了,所以可以省略默认的段寄存器DS,正因为如此DS必须预先指定为0,否则会引起混乱。

再对ipl.nas进行改动:

; haribote-ipl
; TAB=4

        ORG     0x7c00          ; 这个程序被读入哪里(指明程序的装载地址)

; 以下是标准FAT12格式软盘的描述

        JMP     entry
        DB      0x90            
        DB      "HARIBOTE"      ; 引导扇区的名字可以是任意字符串(8字节)
        DW      512             ; 每个扇区的大小(必须为512字节)
        DB      1               ; 簇的大小(必须是一个扇区)
        DW      1               ; FAT的起始位置(一般从第一个扇区开始)
        DB      2               ; FAT的个数(必须是2)
        DW      224             ; 根目录区域的大小(一般为224项)
        DW      2880            ; 该磁盘的大小(必须是2880扇区)
        DB      0xf0            ; 磁盘种类(必须为0xf0)
        DW      9               ; FAT区域的长度(必须为9个扇区)
        DW      18              ; 1个磁道有几个扇区(必须是18)
        DW      2               ; 磁头数(必须是2)
        DD      0               ; 不使用分区,必须是0 
        DD      2880            ; 重写一次磁盘大小
        DB      0,0,0x29        ; 意义不明,固定
        DD      0xffffffff      ; (可能是)卷标号码
        DB      "HARIBOTEOS "   ; 磁盘的名称(11字节)
        DB      "FAT12   "      ; 磁盘格式名称(8字节)
        RESB    18              ; 先空出18个字节

; 程序本体:

entry:
        MOV     AX,0            ; 寄存器初始化
        MOV     SS,AX
        MOV     SP,0x7c00       
        MOV     DS,AX

; 读取软盘

        MOV     AX,0x0820
        MOV     ES,AX           
        MOV     CH,0            ; 柱面0
        MOV     DH,0            ; 磁头0
        MOV     CL,2            ; 扇区2

        MOV     SI,0            ; 记录失败次数的寄存器
retry:
        MOV     AH,0x02         ; AH=0x02 : 读入磁盘
        MOV     AL,1            ; 1个扇区 
        MOV     BX,0            
        MOV     DL,0x00         ; A驱动器
        INT     0x13            ; 磁盘BIOS调用
        JNC     fin             ; 如果没出错的话就跳转到fin
        ADD     SI,1            ; SI加1
        CMP     SI,5            ; SI与5比较
        JAE     error           ; SI >= 5的话进入error
        MOV     AH,0x00         
        MOV     DL,0x00         ; A驱动器
        INT     0x13            ; 重置驱动器
        JMP     retry

; 虽然读完了,但是因为没什么要做的所以睡觉

fin:
        HLT                     ; 让CPU休眠,等待指令
        JMP     fin             ; 无限循环

error:
        MOV     SI,msg
putloop:
        MOV     AL,[SI]
        ADD     SI,1            ; SI加1
        CMP     AL,0
        JE      fin
        MOV     AH,0x0e         ; 显示一个文字
        MOV     BX,15           ; 指定字符颜色
        INT     0x10            ; 调用显卡BIOS
        JMP     putloop
msg:
        DB      0x0a, 0x0a       ; 换行2次
        DB      "load error"
        DB      0x0a            ; 换行1次
        DB      0

        RESB    0x7dfe-$        ; 填写0x00,直到0x07dfe

        DB      0x55, 0xaa

指令JNC:进位标志是0就跳转
指令JAE:大于或等于时跳转
指令JBE:小于等于则跳转

这三个语句加在一起的作用是复位软盘状态:

MOV     AH,0x00         
MOV     DL,0x00         ; A驱动器
INT     0x13            ; 重置驱动器

然后,我们再次修改ipl.nas:

; haribote-ipl
; TAB=4

        ORG     0x7c00

; 以下是标准FAT12格式软盘的描述

        JMP     entry
        DB      0x90
        DB      "HARIBOTE"      ; 可以自由的写引导扇区的名字(8字节)
        DW      512             ; 每个扇区的大小(必须是512字节)
        DB      1               ; 簇的大小(必须是1个扇区)
        DW      1               ; FAT的起始位置(一般从第一个扇区开始)
        DB      2               ; FAT的个数 (必须是2)
        DW      224             ; 根目录区域的大小 (一般为224项)
        DW      2880            ; 该软盘的大小(必须是2880扇区)
        DB      0xf0            ; 磁盘类型(必须是0xf0)
        DW      9               ; FAT区域的长度 (必须是9个扇区)
        DW      18              ; 一个磁道有几个扇区(必须是18)
        DW      2               ; 磁头的数量(必须是2)
        DD      0               ; 因为没有使用分区,所以这里一定是0
        DD      2880            ; 重写一次磁盘大小
        DB      0,0,0x29        ; 意义不明,固定
        DD      0xffffffff      ; (可能是)卷标号码
        DB      "HARIBOTEOS "   ; 磁盘的名称(11字节)
        DB      "FAT12   "      ; 磁盘格式的名称(8字节)
        RESB    18              ; 先空出18个字节

; 程序本体

entry:
        MOV     AX,0            ; 寄存器初始化
        MOV     SS,AX
        MOV     SP,0x7c00       
        MOV     DS,AX

; 读取软盘

        MOV     AX,0x0820
        MOV     ES,AX
        MOV     CH,0            ; 柱面0
        MOV     DH,0            ; 磁头0
        MOV     DL,2            ; 扇区2
readloop:
        MOV     SI,0            ; 计算失败次数的寄存器
retry:
        MOV     AH,0x02         ; AH=0x02 : 磁盘读取
        MOV     AL,1            ; 1个扇区
        MOV     BX,0
        MOV     DL,0x00         ; A驱动器
        INT     0x13            ; 调用磁盘BIOS
        JNC     next            ; 如果没有错误的话进入next
        ADD     SI,1            ; SI加1
        CMP     SI,5            ; 比较SI和5
        JAE     error           ; SI>=5的话进入error
        MOV     AH,0x00
        MOV     DL,0x00         ; A驱动器
        INT     0x13            ; 重置驱动器
        JMP     retry 
next:
        MOV     AX,ES           ; 把内存地址后移0x200
        ADD     AX,0x0020
        MOV     ES,AX           ; 因为没有ADD ES,0x020的命令,所以这里绕了个弯
        ADD     CL,1            ; CL加1
        CMP     CL,18           ; 比较SI和18
        JBE     readloop        ; 如果CL<= 18的话去readloop

; 虽然读完了,但是因为没什么要做的所以睡觉

fin:
        HLT                     ; 使CPU处于休眠,等待信号
        JMP     fin             ; 无限循环

error:
        MOV     SI,msg          
putloop:
        MOV     AL,[SI]
        ADD     SI,1            ; SI加1
        CMP     AL,0
        JE      fin             
        MOV     AH,0x0e         ; 显示一个字符
        MOV     BX,15           ; 彩色编码
        INT     0x10            ; 磁盘BIOS调用
        JMP     putloop
msg:
        DB      0x0a, 0x0a      ; 两个换行
        DB      "load error"
        DB      0x0a            ; 换行
        DB      0

        RESB    0x7dfe-$        ; 用0x00填充,直到0x7dfe

        DB      0x55,0xaa

再一次修改ipl.nas:

; haribote-ipl
; TAB=4

CYLS    EQU     10              ; 读入到哪里

        ORG     0x7c00          ; 指明程序的装载地址

; 以下是标准FAT12格式软盘的描述

        JMP     entry
        DB      0x90
        DB      "HARIBOTE"      ; 可以自由的写引导扇区的名字(8字节)
        DW      512             ; 每个扇区的大小(必须是512字节)
        DB      1               ; 簇的大小(必须是1个扇区)
        DW      1               ; FAT的起始位置(一般从第一个扇区开始)
        DB      2               ; FAT的个数 (必须是2)
        DW      224             ; 根目录区域的大小 (一般为224项)
        DW      2880            ; 该软盘的大小(必须是2880扇区)
        DB      0xf0            ; 磁盘类型(必须是0xf0)
        DW      9               ; FAT区域的长度 (必须是9个扇区)
        DW      18              ; 一个磁道有几个扇区(必须是18)
        DW      2               ; 磁头的数量(必须是2)
        DD      0               ; 因为没有使用分区,所以这里一定是0
        DD      2880            ; 重写一次磁盘大小
        DB      0,0,0x29        ; 意义不明,固定
        DD      0xffffffff      ; (可能是)卷标号码
        DB      "HARIBOTEOS "   ; 磁盘的名称(11字节)
        DB      "FAT12   "      ; 磁盘格式的名称(8字节)
        RESB    18              ; 先空出18个字节

; 程序本体

entry:
        MOV     AX,0            ; 寄存器初始化
        MOV     SS,AX
        MOV     SP,0x7c00       
        MOV     DS,AX

; 读取软盘

        MOV     AX,0x0820
        MOV     ES,AX
        MOV     CH,0            ; 柱面0
        MOV     DH,0            ; 磁头0
        MOV     CL,2            ; 扇区2
readloop:
        MOV     SI,0            ; 计算失败次数的寄存器
retry:
        MOV     AH,0x02         ; AH=0x02 : 磁盘读取
        MOV     AL,1            ; 1个扇区
        MOV     BX,0
        MOV     DL,0x00         ; A驱动器
        INT     0x13            ; 调用磁盘BIOS
        JNC     next            ; 如果没有错误的话进入next
        ADD     SI,1            ; SI加1
        CMP     SI,5            ; 比较SI和5
        JAE     error           ; SI>=5的话进入error
        MOV     AH,0x00
        MOV     DL,0x00         ; A驱动器
        INT     0x13            ; 重置驱动器
        JMP     retry 
next:
        MOV     AX,ES           ; 把内存地址后移0x200
        ADD     AX,0x0020
        MOV     ES,AX           ; 因为没有ADD ES,0x020的命令,所以这里绕了个弯
        ADD     CL,1            ; CL加1
        CMP     CL,18           ; 比较SI和18
        JBE     readloop        ; 如果CL<= 18的话去readloop
        MOV     CL,1            
        ADD     DH,1
        CMP     DH,2
        JB      readloop        ; DH<2的话进入readloop
        MOV     DH,0
        ADD     CH,1
        CMP     CH,CYLS
        JB      readloop        ; 如果CH小于CYLS,则跳转到readloop

; 虽然读完了,但是因为没什么要做的所以睡觉

fin:
        HLT                     ; 使CPU处于休眠,等待信号
        JMP     fin             ; 无限循环

error:
        MOV     SI,msg          
putloop:
        MOV     AL,[SI]
        ADD     SI,1            ; SI加1
        CMP     AL,0
        JE      fin             
        MOV     AH,0x0e         ; 显示一个字符
        MOV     BX,15           ; 彩色编码
        INT     0x10            ; 磁盘BIOS调用
        JMP     putloop
msg:
        DB      0x0a, 0x0a      ; 两个换行
        DB      "load error"
        DB      0x0a            ; 换行
        DB      0

        RESB    0x7dfe-$        ; 用0x00填充,直到0x7dfe

        DB      0x55,0xaa

指令JB:如果小于的话就跳转
cylinder可以译为“柱面”。“CYLS EQU 10” 的意思是CYLS=10,相当于C语言的#define命令,用来声明常数


1月12日更新:
作者通过haribote.img这个文件,在书中说明:

一般向一个空软盘保存文件时:
(1)文件名会写在0x002600以后的地方
(2)文件名会写在0x004200以后的地方

之后修改了ipl.nas,haribote.nas这两个文件。
关于如何设置显卡模式的问题,书上是这么说的:

AH=0x00
AL=模式:
0x03 : 16色字符模式,8025
0x12 : VGA图形模式,640
4804位彩色模式,独特的4面存储模式
0x6a : 扩展VGA图形模式,800
600*4位彩色模式,独特的4面存储模式
返回值:无

作者提到的有一点我给记下来:

CPU的自我保护功能(识别出可疑的机器语言并进行屏蔽以免破坏系统)在16位下不能使用,在32位的条件下能用。
但是BIOS是用16位的机器语言书写的。一旦使用32位模式就不能调用BIOS功能了,解决的思路就是把用BIOS函数的工作全部放在开头先做,因为一旦进入32位模式就不能调用BIOS函数了。

VRAM指的是显卡内存,也就是用来显示画面的内存,它的各个地址都对应着画面上的像素,可以利用这一机制在画面上绘出五彩缤纷的图案。顺带说,VRAM分布在内存分布图上好几个不同的地方

根据书上的说法,总结一下bootpack.c变成机器语言的过程:
在这里插入图片描述

为了让电脑处于HALT状态,编写了naskfunc.nas:

; naskfunc
; TAB=4

[FORMAT "WCOFF"]    ; 制作目标文件的模式,之所以采用这一模式,是因为用汇编写的函数还要和bootpack.obj链接因此也需要编译成目标文件
[BITS 32]           ; 制作32位模式用的机器语言

; 制作目标文件的信息

[FILE "naskfunc.nas"]   ; 源文件名信息

        GLOBAL  _io_hlt     ; 程序中包含的函数名(在CPU的指令中,HLT指令也属于I/O指令)
; 需要链接的函数名,都需要用GLOBAL声明

; 以下是实际的函数

[SECTION .text]         ; 目标文件中写了这些之后再写程序

_io_hlt:                ; void io_hlt(void)
        HLT
        RET                 ; 这个相当于C语言中的return,意思是"函数的处理到此结束,返回吧”

里面的io_hlt函数在C语言中是这么使用的:

//告诉C编译器,有一个函数在别的文件里
void io_hlt(void);

//在上面直接用了分号,意思是: 函数在别的文件中,你自己找一下吧

void HariMain(void)
{
    fin:
        io_hlt(); //执行naskfunc.nas里的_io_hlt
        goto fin; //我想在这里加入HLT,但是c语言不能使用HLT!
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动态内存管理】-关于动态内存你只知道四个函数是不够的,这里还有题目教你怎么正确使用函数,还不进来看看??

&#x1f387;作者&#xff1a;小树苗渴望变成参天大树 &#x1f4a6;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a2; 作者gitee&#xff1a;link 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; &#x1f38a;动态内存管理&…

adrp 命令为何能获取符号的地址

疑问所在 在linux 启动时&#xff0c;在如下位置会将bootloader 传入的x0 - x3 参数保存到boot_args[] 变量中。代码如下&#xff1a; /* …

神经网络基础部件-损失函数详解

一&#xff0c;损失函数概述 大多数深度学习算法都会涉及某种形式的优化&#xff0c;所谓优化指的是改变 xxx 以最小化或最大化某个函数 f(x)f(x)f(x) 的任务&#xff0c;我们通常以最小化 f(x)f(x)f(x) 指代大多数最优化问题。 在机器学习中&#xff0c;损失函数是代价函数的…

Spring Security 多过滤链的使用

一、背景 在我们实际的开发过程中&#xff0c;有些时候可能存在这么一些情况&#xff0c;某些api 比如&#xff1a; /api/** 这些是给App端使用的&#xff0c;数据的返回都是以JSON的格式返回&#xff0c;且这些API的认证方式都是使用的TOKEN进行认证。而除了 /api/** 这些API…

Qt扫盲-QTextEdit理论总结

QTextEdit理论总结一、概述二、用途一&#xff1a;富文本阅读器1. 用法2. 快捷键绑定三、用途二&#xff1a;编辑器1. 用法2. 拖拽3. 快捷键绑定四、常用功能五、信号一、概述 QTextEdit是一个先进的所见即所得的 富文本 查看器/编辑器&#xff0c;支持使用 html 风格的标签或…

【QT】.pro 文件

&#x1f33f;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;QT开发 .pro 文件是什么 .pro就是工程文件(project)&#xff0c;它是qmake自动生成的用于生产makefile的配置文件。类似于VS中的.sln 和vsproj文件 默认情况下&#xff0c;每个 Qt 项目都包含一个后缀名为…

Huffman编码实现文件的压缩和解压缩

一个项目&#xff0c;不过处理起来也比较麻烦&#xff0c;配套可以和文件传输放一起 前提知识&#xff1a; 哈夫曼树和哈夫曼编码的概念和构建 1&#xff1a;n个数构成的哈夫曼树一共有2*n-1个结点>8 -> 15 2&#xff1a;数字越大的数离根节点越近&#xff0c;越小的数离…

无线耳机跑步会不会掉、最适合跑步用的耳机排名

现在&#xff0c;喜欢运动的人越来越多了。大家都有体会&#xff0c;多数运动是相对枯燥的&#xff0c;在运动时听听音乐&#xff0c;那是多么惬意的事情啊。为此&#xff0c;体验过多款耳机&#xff0c;但令我很满意的甚少。相信不少喜欢运动的朋友都有着跟我一样的烦恼吧&…

【Java基础知识3】Java注释:单行、多行、文档注释(如何通过 javadoc 命令生成代码文档、如何在IEDA配置自动为所有的类都添加创建者和创建日期)

本文已收录专栏 &#x1f332;《Java进阶之路》&#x1f332; 目录 本文已收录专栏 &#x1f332;《Java进阶之路》&#x1f332; &#x1f350;01、单行注释 &#x1f350;02、多行注释 &#x1f350;03、文档注释 &#x1f350;04、文档注释的注意事项 &#x1f350;05、注释…

ceres学习笔记(二)

继续关于ceres官方doc里教程的学习&#xff0c;对于powells function的学习。 一、powells function 鲍威尔法&#xff0c;严格来说是鲍威尔共轭方向法&#xff0c;是迈克尔J.D.鲍威尔提出的一种求解函数局部最小值的算法。该函数不能是可微分的&#xff0c;并且不会导出衍生函…

spring用注解读取与获取对象

前言 上一篇博客简单的介绍了spring的功能与使用&#xff0c;可以看到我们创建一个对象&#xff0c;就需要在xml中存储一个bean对象&#xff0c;这种操作非常的繁琐&#xff0c;因此spring发明了使用注解来快捷存储bean对象 配置工作 我们在xml文件中写下面的代码片段 <…

基于风光储能和需求响应的微电网日前经济调度(Python代码实现)【0】

目录 0 引言 1 计及风光储能和需求响应的微电网日前经济调度模型 1.1风光储能需求响应都不参与的模型 1.2风光参与的模型 1.3风光和储能参与模型 1.4 风光和需求响应参与模型 1.5 风光储能和需求响应都参与模型 2 需求侧响应评价 2.1 负载率 2.2 可再生能源消纳率 …

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分 V1.0版本发布 2022年1月19日 内置常用PE工具&#xff0c;7-Zip、EasyImageX_x64、XorBoot Uefi修复、NT6修复、Ghost、CGI、Google浏览器、PENetwork、RegWorkshop、迅雷迷你版、、BOOTICEx64、windows安装器、XP安…

路径计数2

路径计数2 题目描述 一个NNN \times NNN的网格&#xff0c;你一开始在(1,1)(1,1)(1,1)&#xff0c;即左上角。每次只能移动到下方相邻的格子或者右方相邻的格子&#xff0c;问到达(N,N)(N,N)(N,N)&#xff0c;即右下角有多少种方法。 但是这个问题太简单了&#xff0c;所以现…

MySQL 数据同步 Elasticsearch 的技术方案选型

文章目录1.同步双写2.异步双写3.定时任务4.数据订阅1.同步双写 优点&#xff1a;实现简单缺点&#xff1a; 业务耦合&#xff0c;商品的管理中耦合大量数据同步代码 影响性能&#xff0c;写入两个存储&#xff0c;响应时间变长 不便扩展&#xff1a;搜索可能有一些个性化需求&…

jvm学习的核心(三)---运行时数据区详解(1)

图片等相关信息来源于&#xff1a;尚硅谷宋红康JVM全套教程 1.程序计数器 程序计数器又叫pc寄存器&#xff0c;中文有两个名字 我们可以反编译字节码文件查看方法中操作指令对应的指令地址 javap -v "对应的class文件"为什么要用pc寄存器&#xff0c;pc寄存器有什…

13、Javaweb_Filter登陆验证动态代理过滤敏感词Listener

Filter&#xff1a;过滤器 1. 概念&#xff1a; * 生活中的过滤器&#xff1a;净水器,空气净化器&#xff0c;土匪、 * web中的过滤器&#xff1a;当访问服务器的资源时&#xff0c;过滤器可以将请求拦截下来&#xff0c;完成一些特殊的功能。 * 过滤器的作用&…

深入理解计算机系统_可执行目标文件和可重定位目标文件的3个区别

这篇笔记对比一下可执行目标文件和可执行目标的3个区别。下图分别是可重定位目标文件和可执行目标文件各段结构。 1.1 可执行目标文件和可重定位目标文件的3个区别 区别1&#xff1a;可执行目标文件的rel.text和.rel.data消失了 链接器将.o中.text和.data节整合到一起时&a…

【ROS2入门】理解 ROS 2 Topics 话题

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们一起了解ROS 2中节点的功能以及与之交互的工具&#xff0c; 这一篇&#xff0c;我们主要会围绕ROS中另外一个重要的…

RS232 RS485 TO ETH TCP-Modbus 测试

原来modbus 传感器都是有对应的指令码的&#xff0c;不同功能的指令码也不一样&#xff0c;比如测温度和湿度的指令码也是不一样的&#xff1b; 硬件连接如下图 &#xff08;温湿度传感器&#xff0c;板载SHT20&#xff09; ​ 编辑切换为居中 添加图片注释&#xff0c;不超…