我要开始啦!bulabulabulabulabula.


例题

物理地址=DS*16+有效地址 

1.直接寻址

2.直接寻址(允许符号代替数值,变量存的地址)

3.基址寻址(16位:用寄存器SI、DI、BX、BP存的有效地址)

下面是寄存器间接寻址👇

(1)16位

(2)32位

除ESP和EBP默认段寄存器为SS外,其余6个通用寄存器均默认段寄存器为DS


下面是基址寻址👇

4.基址加变址寻址

变址寻址就是带了变址寄存器(如SI、DI),默认DS为段基址寄存器。

基址加变址寻址就是带了基址寄存器+变址寄存器

5.基址变址相对寻址

为什么是基址?因为有效地址放在寄存器里了,BP

为什么是变址?因为有变址寄存器,SI

为什么是相对??

段基址用SS,因为基址寄存器用的BP

已懵圈。

1.段寄存器不能直接赋立即数

2.内存之间不能直接传输数据

3.LEA的目标必须是寄存器

4.PUSH必须16/31,可以扩展AL到AX

5.MUL只有一个操作数

首先,咱们要知道一个指令大概长这样:助记符 目标操作数,源操作数

然后我们检查操作数数量、操作数类型、操作数大小

MUL是单操作数;MOV是俩

操作数类型是否允许组合?寄存器、内存、立即数

PUSH不能是8位

1.

MOV AX,SEG VAR0
MOV DS,AX

2.

MOV CL,4
SAL BX,CL

是把BX左移四位

逻辑左移SHL

算数左移SAL

移位次数置于CL中

3.

CMP DX, 0   ; 比较DX和0
JGE POSITIVE ; 如果DX ≥ 0,跳到POSITIVE
NEG DX      ; 否则对DX取负
POSITIVE:

CMP DX,0
JGE SKIP
NEG DX
SKIP:

 4.

TEST AX, 3  ; 检查最后2位是否为0
JZ LAB0     ; 如果结果为0(能被4整除),跳转到LAB0

AND AX, 3
CMP AX, 0
JE LAB0

如果能被四整除,后两位一定是00。

3的二进制是11,如果AX与11AND的结果是00,那么AX一定能被4整除

AND结果写到AX里,进行比较JE(JE和JZ一样,结果为0跳转)

5.

MOV DI, 2025     ; 设置目标地址(DI=2025)
MOV CX, 100      ; 设置计数器(CX=100)
MOV AL, 0        ; 要存储的值(AL=0)
CLD              ; 清除方向标志(DF=0,地址递增)
REP STOSB        ; 重复执行: [ES:DI]←AL, DI←DI+1

"DI当快递员,CX记件数,AL带零蛋,CLD向前冲,REP自动干"

MOV DI, 2025     ; 快递员站在2025号仓库(起始地址)
MOV CX, 100      ; 今天要送100个包裹(计数器)
MOV AL, 0        ; 每个包裹里是数字0(要存储的值)
CLD              ; 设定方向:向前走(DF=0,地址递增)
REP STOSB        ; 开始自动送货!; 动作分解:; 1. 把AL的0放进[DI]仓库; 2. DI向前走1步(+1); 3. CX减1(剩余包裹数); 重复直到CX=0

MOV SI, 2025     ; 起始地址
MOV CX, 100      ; 计数器
MOV AL, 0        ; 清零值
CLEAR_LOOP:MOV [SI], AL ; 清零当前字节INC SI       ; 地址+1LOOP CLEAR_LOOP ; CX减1,若CX≠0则循环
MOV SI, 2025     ; 把SI寄存器当作"指针",指向内存地址2025(就像C语言的 int *p=2025)
MOV CX, 100      ; CX是计数器,表示要清零100个字节(像 for(int i=100; i>0; i--))
MOV AL, 0        ; AL是8位寄存器,存要写入的值0(像 char zero=0)CLEAR_LOOP:      ; 循环开始标签(像 while(true){ )MOV [SI], AL ; 把0写入SI指向的内存位置(像 *p = zero)INC SI       ; 指针SI向后移动1字节(像 p++)LOOP CLEAR_LOOP ; CX减1,如果CX≠0就跳回循环开始(像 if(--i>0) goto loop)

; 假设在数据段已定义100字节的零缓冲区ZERO_BUFFER
MOV SI, OFFSET ZERO_BUFFER ; 源地址(全零)
MOV DI, 2025               ; 目标地址
MOV CX, 100                ; 字节数
CLD
REP MOVSB                  ; 复制零到目标区域

ORG(origin)设置起始地址为150H

DUP是复读机

X4那行,连续存了三个,第一个是1234H,第二个是当前地址(0160H)-20?最后一个是(0162H)+25?

$地址

-106=96H85=55H
DW低字节=E9DW高字节=07
D的ascii=44o的ascii=6F
u=75b=62
l=6Ce=65
34=22H-69=BBH
34=22H-69=BBH
1234H低字节=34H1234H高字节=12H
-20低字节=4CH-20高字节=01H
+25低字节=8BH?好像不太对+25高字节=01H

 

"DB放字节,DW存字;
负数转补码,字符串ASCII;
DUP是复制,$是当前位置;
小端记心间,地址逐个加!" 

DATA SEGMENTARRAY DB 23, 5, 17, 3, 8, 12   ; 定义无符号字节数组(示例数据)LEN EQU $-ARRAY                 ; 计算数组长度RESULT DW ?                     ; 存放结果的字变量
DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA
START:MOV AX, DATAMOV DS, AX          ; 设置DS指向数据段; 初始化:假设前两个元素是最小的MOV AL, ARRAY[0]    ; AL = 第一个数MOV BL, ARRAY[1]    ; BL = 第二个数; 确保AL <= BL(交换使AL存最小值,BL存次小值)CMP AL, BLJBE NO_SWAP         ; 如果AL <= BL,不交换XCHG AL, BL         ; 否则交换AL和BL
NO_SWAP:; 遍历数组剩余元素(从第3个开始)MOV CX, LEN - 2     ; 循环次数 = 数组长度 - 2MOV SI, 2           ; 数组索引从2开始
FIND_MIN:MOV DL, ARRAY[SI]   ; 取出当前元素; 比较当前元素与最小值ALCMP DL, ALJAE CHECK_SECOND    ; 如果DL >= AL,检查是否比BL小; 更新最小值和次小值MOV BL, AL          ; 原最小值变成次小值MOV AL, DL          ; DL成为新的最小值JMP NEXT_ITERCHECK_SECOND:CMP DL, BLJAE NEXT_ITER       ; 如果DL >= BL,跳过MOV BL, DL          ; 否则更新次小值NEXT_ITER:INC SI              ; 移动到下一个元素LOOP FIND_MIN       ; 循环处理; 计算和并存入RESULTXOR AH, AH          ; 清空AH(AL是无符号字节)ADD AL, BL          ; AL = AL + BLADC AH, 0           ; 处理可能的进位(和>255时)MOV RESULT, AX      ; 保存结果到RESULTMOV AH, 4CHINT 21H             ; 程序结束
CODE ENDS
END START

DATA SEGMENTBUFFER DB 201 DUP(?)       ; 输入缓冲区(200字符+1回车)X1 DB 0                    ; 大写字母计数器X2 DB 0                    ; 小写字母计数器X3 DB 0                    ; 数字计数器X4 DB 0                    ; 其他字符计数器MSG DB 'Input a string: $'
DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA
START:MOV AX, DATAMOV DS, AX                 ; 设置DS指向数据段; 显示提示信息MOV AH, 09HLEA DX, MSGINT 21H; 从键盘读取字符串MOV AH, 0AHLEA DX, BUFFERMOV BUFFER, 200            ; 设置最大长度INT 21H; 统计字符LEA SI, BUFFER + 2         ; SI指向实际输入的字符串首地址MOV CL, BUFFER + 1         ; CL=实际输入字符数MOV CH, 0                  ; CX=字符数JCXZ DONE                  ; 如果输入为空则跳过COUNT_LOOP:MOV AL, [SI]               ; 取当前字符; 检查大写字母(A-Z)CMP AL, 'A'JB NOT_UPPERCMP AL, 'Z'JA NOT_UPPERINC X1JMP NEXT_CHARNOT_UPPER:; 检查小写字母(a-z)CMP AL, 'a'JB NOT_LOWERCMP AL, 'z'JA NOT_LOWERINC X2JMP NEXT_CHARNOT_LOWER:; 检查数字(0-9)CMP AL, '0'JB OTHERCMP AL, '9'JA OTHERINC X3JMP NEXT_CHAROTHER:INC X4                     ; 其他字符计数NEXT_CHAR:INC SI                     ; 指向下一个字符LOOP COUNT_LOOP            ; CX减1,循环直到CX=0DONE:MOV AH, 4CHINT 21H                    ; 程序结束
CODE ENDS
END START

一、数组求和中断程序 

; 数据段定义
DATA SEGMENTARRAY DW -100, 200, -50, 300, 150  ; 定义带符号字数组LEN EQU ($-ARRAY)/2                 ; 计算数组长度RESULT DD ?                         ; 保存结果的变量
DATA ENDS; 代码段
CODE SEGMENTASSUME CS:CODE, DS:DATA; 主程序MAIN PROC FARMOV AX, DATAMOV DS, AX; 设置中断向量(假设INT 63H中断向量已指向SUM服务程序)MOV BX, OFFSET ARRAY  ; 数组起始地址MOV CX, LEN           ; 数组长度INT 63H              ; 调用中断服务程序; 保存结果MOV WORD PTR RESULT, AX    ; 低16位MOV WORD PTR RESULT+2, DX  ; 高16位MOV AH, 4CHINT 21HMAIN ENDP; 中断服务程序SUMSUM PROC FARPUSH SIPUSH DIPUSH CXXOR AX, AX    ; 清空AX(低16位)XOR DX, DX    ; 清空DX(高16位)MOV SI, BX    ; 数组起始地址SUM_LOOP:MOV DI, [SI]  ; 取数组元素ADD SI, 2     ; 指向下一个元素; 带符号数累加CMP DI, 0JGE POSITIVE; 负数处理NEG DISUB AX, DISBB DX, 0JMP NEXTPOSITIVE:ADD AX, DIADC DX, 0NEXT:LOOP SUM_LOOPPOP CXPOP DIPOP SIIRETSUM ENDP
CODE ENDS
END MAIN

二、8259A初始化程序

; 主片8259A初始化 (端口320H,321H)
MOV AL, 00010001b    ; ICW1: 边沿触发,级联,需要ICW4
OUT 320H, ALMOV AL, 00011000b    ; ICW2: 中断类型号18H-1FH
OUT 321H, ALMOV AL, 00000100b    ; ICW3: 从片连接在IR5
OUT 321H, ALMOV AL, 00011101b    ; ICW4: 特殊完全嵌套,缓冲,非自动EOI
OUT 321H, AL; 第一个从片8259A初始化 (端口322H,323H)
MOV AL, 00010001b    ; ICW1: 边沿触发,级联,需要ICW4
OUT 322H, ALMOV AL, 10000000b    ; ICW2: 中断类型号80H-87H
OUT 323H, ALMOV AL, 00000101b    ; ICW3: 从片ID=5(连接主片IR5)
OUT 323H, ALMOV AL, 00001001b    ; ICW4: 非特殊完全嵌套,缓冲,非自动EOI
OUT 323H, AL; 第二个从片8259A初始化 (端口324H,325H)
MOV AL, 00010001b    ; ICW1: 边沿触发,级联,需要ICW4
OUT 324H, ALMOV AL, 10001000b    ; ICW2: 中断类型号88H-8FH
OUT 325H, ALMOV AL, 00000101b    ; ICW3: 从片ID=5(连接主片IR5)
OUT 325H, ALMOV AL, 00001001b    ; ICW4: 非特殊完全嵌套,缓冲,非自动EOI
OUT 325H, AL

三、

四、8254计数器初始化

; 计数器0初始化(方式2,二进制计数,初值216)
MOV AL, 00110100b    ; 控制字: 00计数器,先低后高字节,方式2,二进制
OUT 7F3H, AL
MOV AL, 216          ; 计数初值低字节
OUT 7F0H, AL
MOV AL, 0            ; 计数初值高字节
OUT 7F0H, AL; 计数器1初始化(方式0,BCD计数,初值7500)
MOV AL, 01110001b    ; 控制字: 01计数器,先低后高字节,方式0,BCD
OUT 7F3H, AL
MOV AL, 00H          ; 计数初值低字节(7500的BCD码: 7500H)
OUT 7F1H, AL
MOV AL, 75H          ; 计数初值高字节
OUT 7F1H, AL; 计数器2初始化(方式3,二进制计数,初值35FFH)
MOV AL, 10110110b    ; 控制字: 10计数器,先低后高字节,方式3,二进制
OUT 7F3H, AL
MOV AL, 0FFH         ; 计数初值低字节
OUT 7F2H, AL
MOV AL, 35H          ; 计数初值高字节
OUT 7F2H, AL; 读取计数器2当前值
MOV AL, 10000000b    ; 控制字: 锁存计数器2当前值
OUT 7F3H, AL
IN AL, 7F2H          ; 读低字节
MOV AH, AL
IN AL, 7F2H          ; 读高字节
XCHG AH, AL          ; 调整字节顺序
MOV COUNT, AX        ; 保存到COUNT变量

五、8237A初始化程序

; 8237A初始化
; 先发送主清除命令
MOV AL, 0
OUT 0A00DH, AL       ; 主清除命令; 设置命令寄存器
MOV AL, 00000000b    ; 正常时序,固定优先级,正常写,DREQ高有效,DACK高有效
OUT 0A008H, AL; 设置模式寄存器(通道1,单字节传输,读传输,自动预置禁止)
MOV AL, 01001001b    ; 通道1,模式49H
OUT 0A00BH, AL; 设置地址寄存器(低16位)
MOV AX, OFFSET BUFF
OUT 0A002H, AL       ; 低字节
MOV AL, AH
OUT 0A002H, AL       ; 高字节; 设置地址寄存器(高4位,页面寄存器)
MOV AL, SEG BUFF     ; 取段地址
AND AL, 0FH          ; 取高4位
OUT 0A083H, AL       ; 通道1页面寄存器(A000H+83H); 设置字节计数器
MOV AX, 1500         ; 传输字节数
DEC AX               ; 8237A计数为n-1
OUT 0A003H, AL       ; 低字节
MOV AL, AH
OUT 0A003H, AL       ; 高字节; 清除屏蔽位,启动DMA
MOV AL, 00000001b    ; 屏蔽寄存器: 仅通道1非屏蔽
OUT 0A00FH, AL

复习

首先就是补码、ASCII码,有一个计算题用到。比如负数要补码,也就是二进制取反加1;比如字母直接ASCII。

CPU引脚这里应该是CPU引脚功能(地址线、数据线)??

物理地址、逻辑地址、有效地址。

物理地址就是CPU最终访问内存单元的实际地址(20位,00000H~FFFFFH)

计算公式:物理地址=段地址(segment)*16+偏移地址(offset)

逻辑地址就是程序员在汇编语言中使用的地址形式,由段地址:偏移地址组成(如DS:SI)

物理地址的计算公式好像也是这样

有效地址(EA)是偏移地址的计算结果,用于确定操作数在段内的位置,由基址寄存器(BX/BP)+变址寄存器(SI/DI)+位移量(dispplacement)

计算方式:EA=[BX/BP]+[SI/DI]+8/16位位移量,还是有了DS段地址然后公式计算物理地址

段寄存器(CS, DS, ES, SS)与偏移量寄存器(IP, SI, DI, SP, BP)的对应关系

段寄存器主要用途默认偏移量寄存器典型应用场景
CS代码段(Code Segment)IP(指令指针)取指令(CS:IP指向下一条指令)
DS数据段(Data Segment)BX/SI/DI访问数据(如MOV AX,[BX])
ES附加段(Extra Segment)DI(串操作目标)串操作(如MOVSB使用DS:SI->ES:DI)
SS堆栈段(Stack Segment)SP/BP堆栈操作(如PUSH AX使用SS:SP)

寻址方式会看,弄明白源操作数和目标操作数的寻址方式

指令集👇

判断指令的对错

mov d,s两个操作数什么情况下可以赋值👇

两个操作数位数相等、目标操作数必须能重写,x86不能直接从内存到内存(需通过寄存器中转)

各种指令的错误使用👇

1.操作数类型不匹,mov ax,bl(bl是8位,ax是16位)

2.立即数不能直接赋值给段寄存器,要通过中间寄存器中转

3.不能内存到内存

4.特权指令不能乱用

5.错误的栈操作

太多了这也。。。

debug里的调试指令?

各类伪指令?

dos中断(中断向量表)?

断点?

现场?

中断的整个过程?

外部中断:可屏蔽,不可屏蔽

内部中断:异常,陷阱

8259A?

8255A? 8254/8253? 8237A?

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人如何实现智能化的自主定位与导航?

机器人实现智能化自主定位与导航&#xff0c;需融合多传感器数据、高效算法及硬件支撑&#xff0c;以下从技术框架、核心技术、典型应用场景等方面详细解析&#xff1a; 一、技术框架&#xff1a;定位与导航的核心环节 机器人自主定位导航通常包含三个关键步骤&#xff0c;形…

AI医疗行业全景图

AI医疗是以互联网为依托&#xff0c;通过基础设施的搭建及数据的收集&#xff0c;将人工智能技术及大数据服务应用于医疗行业中&#xff0c;提升医疗行业的诊断效率及服务质量&#xff0c;更好的解决医疗资源短缺、人口老龄化的问题AI在医疗领域应用广泛&#xff0c;覆盖医疗服…

Meta-KDD2025-RPG-token级别并行生成式提高效率!

文章目录 1. 背景2. 方法2.1 长语义id2.1.1 获取 item embedding2.1.2 item embedding 离散化 2.2 并行生成语义 id2.2.1 训练&#xff08;item串行&#xff0c;token并行&#xff09;2.2.2 高效 logit 打分暴力枚举式打分&#xff1a;高效实现&#xff1a;复杂度分析&#xff…

快速搭建MySQL8.0本地数据库,连接idea

1.打开终端&#xff0c;按顺序输入命令&#xff0c;在root用户下&#xff0c;创建用户和数据库 1.进入数据库 mysql -u root -p 2.创建专用数据库 create database 数据库名 character set utf8mb4 3.使用数据库 use 数据库名 4.设置此数据库用户 create user "用户名&q…

Docker 常用运维命令

Docker 提供了一系列命令来帮助开发者和运维人员管理容器、镜像以及其他 Docker 对象。以下是一些常用的 Docker 运维命令&#xff0c;这些命令可以帮助你更高效地进行日常操作&#xff1a; 容器相关命令 启动容器&#xff1a; docker start <container_id_or_name>停止…

linux下MQTT订阅发布验证-mosquitto安装测试流程

本文详细介绍了&#xff0c;如何在linux环境搭建一个MQTT server, 并同时安装 了客户端 &#xff0c;进行了mqtt消息发布、订阅验证。 mosquitto 服务端安装(ubuntu) #添加源 sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppasudo apt update # install mosquitto su…

Source Insight 的简单介绍

对 Source Insight 进行一次全面深入的介绍。这款软件在特定开发者群体中&#xff08;尤其是嵌入式、驱动、系统级编程领域&#xff09;享有极高的声誉&#xff0c;被誉为“源码阅读和分析的神器”。 一、 起源与历史 诞生背景 (1990年代中后期)&#xff1a; 在1990年代中后期…

Linux 系统中,查询 JDK 的安装目录

在 Linux 系统中&#xff0c;查询 JDK 的安装目录可以通过以下几种常用方法&#xff1a; 方法 1&#xff1a;通过 update-alternatives 查询&#xff08;推荐&#xff09; 适用于通过包管理器&#xff08;如 apt/yum&#xff09;安装的 JDK&#xff1a; sudo update-alternat…

简单工厂、工厂、抽象工厂模式

简单工厂、工厂、抽象工厂模式 1. **简单工厂模式&#xff08;Simple Factory&#xff09;**2. **工厂方法模式&#xff08;Factory Method&#xff09;**3. **抽象工厂模式&#xff08;Abstract Factory&#xff09;**对比总结 以下是三种工厂模式在C#中的实现与对比分析&…

如何在Redis中实现缓存功能

Redis 是一种高性能的键值存储系统&#xff0c;广泛用于实现缓存功能。它通过将数据存储在内存中&#xff0c;能够快速读写数据&#xff0c;从而显著提高应用程序的性能。在Redis中实现缓存功能需要结合数据读写策略、失效机制及性能优化方案。 一、Redis作为缓存的核心优势 …

Kafka消费者客户端源码深度解析:从架构到核心流程

在Kafka生态系统中&#xff0c;消费者客户端作为数据消费的入口&#xff0c;其设计与实现直接影响数据处理的效率和可靠性。本文将深入Kafka消费者客户端源码&#xff0c;通过核心组件解析、流程拆解与源码分析&#xff0c;揭示其高性能消费背后的技术奥秘&#xff0c;并辅以架…

从0开始学习R语言--Day26--因果推断

很多时候我们在探讨数据的相关性问题时&#xff0c;很容易会忽略到底是数据本身的特点还是真的是因为特征的区分导致的不同&#xff0c;从而误以为是特征起的效果比较大。 这就好比测试一款新药是否真的能治病&#xff0c;假如吃药的患者康复的更快&#xff0c;那到底是因为药…

Python 中布尔值的使用:掌握逻辑判断的核心

在 Python 中&#xff0c;布尔值&#xff08;bool&#xff09;是进行逻辑判断的基础。布尔值只有两个可能的值&#xff1a;True 和 False。通过布尔值&#xff0c;你可以实现条件判断、循环控制以及其他逻辑操作。今天&#xff0c;就让我们一起深入探讨如何在 Python 中使用布尔…

IDEA 中 Tomcat 部署 Java Web 项目(Maven 多模块 非 Maven 通用版)(linux+windows)

引言 Java Web 开发中&#xff0c;Tomcat 是最常用的 Servlet 容器&#xff0c;而项目类型通常分为 Maven 管理&#xff08;依赖自动处理、多模块聚合&#xff09; 和 非 Maven 纯手工管理&#xff08;手动引入 jar 包、配置项目结构&#xff09;。本文覆盖 两种项目类型 的 T…

使用 React Native Web 实现三端统一开发

使用 React Native Web 实现三端统一开发 关键点 React Native Web 简介&#xff1a;React Native Web 是一个允许开发者使用 React Native 组件和 API 构建 Web 应用的库&#xff0c;支持在 iOS、Android 和 Web 上使用同一套代码。架构&#xff1a;通过 React DOM 渲染 Rea…

分享一个git上基于std::array实现的循环队列(Cycle Queue)模板类库

为充分利用向量空间,克服“假溢出”现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。 网上有很多关于循…

三维视频融合平台:如何构建动态感知的数字空间

分享大纲&#xff1a; 你的三维平台为何不能承载动态视频捷码打造三维视频融合平台的三步法则为何选择捷码 在智慧城市建设过程中&#xff0c;将实时视频与三维空间结合&#xff0c;已经成为一种主流趋势。传统视频监控模式&#xff0c;经常面临视频分散、操作复杂等问题。然而…

【AI Study】第五天,Matplotlib(5)- 颜色映射

文章概要 本文详细介绍 Matplotlib 的颜色映射功能&#xff0c;包括&#xff1a; 颜色映射类型颜色映射设置数据标准化颜色条 颜色映射类型 pcolormesh import matplotlib.pyplot as plt import numpy as np# 创建网格数据 x np.linspace(-3, 3, 100) y np.linspace(-3,…

DB2中合理使用INCLUDE关键字创建索引

DB2中合理使用 INCLUDE 关键字创建索引 1. 为何还需要 INCLUDE&#xff1f;——从索引的两大痛点说起 查询想“只读索引不回表”&#xff0c;却又不想把列都做键 → 联合索引空间膨胀&#xff0c;更新放大。唯一索引定位快&#xff0c;但只能返回键列数据 → 仍需 I/O 跳回数据…

基于Spring Boot的民宿管理系统设计与实现

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅Spring Boot框架3. ✅Vue.js框架4. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 浏览后台首页1.2 预订信息管理1.3 入住信息管理1.4 退房信息管理1.…