当前位置: 首页 > news >正文

【汇编语言】直接定址表(二)—— 「代码‘导航员’:直接定址表的功能与应用」

在这里插入图片描述

文章目录

  • 前言
  • 1. 直接定址表
    • 1.1 问题引入(一)—— 为算法清晰而查表
    • 1.2 分析与解决问题
      • 1.2.1 两个十六进制表示一个字节
      • 1.2.2 得到数值对应的数码字符
        • 1.2.2.1 最粗暴的方法——比较
        • 1.2.2.2 使用映射关系来解决
        • 1.2.2.3 存在的问题及解决
    • 1.3 得到子程序
    • 1.4 反思
    • 1.5 问题引入(二)—— 为加快运算速度而查表
    • 1.6 分析与解决问题
      • 1.7.1 使用麦克劳林公式
      • 1.7.2 还是用查表简单
    • 1.7 得到子程序
    • 1.8 反思与总结
  • 2. 程序入口地址的直接定址表
    • 2.1 问题引入
    • 2.2 设置入口参数
    • 2.3 各功能的实现
    • 2.4 各功能的子程序
    • 2.5 使用直接定址表调用子程序
    • 2.6 总结
  • 结语

前言

📌

汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

1. 直接定址表

现在,我们将讨论用“查表”的方法编写相关程序的技巧。

1.1 问题引入(一)—— 为算法清晰而查表

任务:编写子程序,以十六进制的形式在屏幕中间显示给定的字节型数据。

1.2 分析与解决问题

1.2.1 两个十六进制表示一个字节

一个字节需要用两个十六进制数码来表示,所以,子程序需要在屏幕上显示两个ASCII 字符。

我们当然要用“0”、“1”、“2”、“3”、“4”、“5” 、“6” 、“7” 、“8” 、“9” 、“A”、“B”、“C”、“D”、“E”、“F”这16个字符来显示十六进制数码。我们可以将一个byte的高4位和低4 位分开,分别用它们的值得到对应的数码字符。比如 2Bh ,我们可以得到高4 位的值为2,低4 位的值为11。

1.2.2 得到数值对应的数码字符

那么我们如何用这两个数值得到对应的数码字符“2”和“B”呢?

1.2.2.1 最粗暴的方法——比较

我知道,我们一看就知道是 2和 B ,但CPU它不懂,它只懂 1 和 0。最简单的办法就是一个一个地比较,如下:

如果数值为 0,则显示“0”;

如果数值为 1,则显示“1”;

如果数值为15,则显示“F”;

我们可以看出,这样做,程序中要使用多条比较、转移指令。程序将比较长,混乱。

1.2.2.2 使用映射关系来解决

显然,我们希望能够在数值0~15和字符“0 ~ F”之间找到一种映射关系。这样我们用0~15间的任何数值,都可以通过这种映射关系直接得到“0”~“F”中对应的字符。

(1)

数值0~9和字符“0”~“9”之间的映射关系是很明显的,即:

数值 + 30h = 对应字符的ASCII值

0+30h = “0”的ASCII值

1+30h = “1”的ASCII值

2+30h = “2”的ASCII值

(2)

但是,10~15和“A”~“F”之间的映射关系是:

数值+37h=对应字符的ASCII值:

10+37h=“A”的ASCII值

11+37h=“B”的ASCII值

12+37h=“C”的ASCII值

:

1.2.2.3 存在的问题及解决

可见,我们是利用数值和字符之间的这种原本存在的映射关系,通过高 4 位和低4 位值得到对应的字符码。

但我们发现一个问题……由于映射关系的不同,我们在程序中必须进行一些比较,对于大于9的数值,我们要用不同的计算方法。

这样做,虽然使程序得到了简化。但是,如果我们希望用更简捷的算法,就要考虑用同一种映射关系从数值得到字符码。所以,我们就不能利用0~9和“0”~“9” 之间与 10~15 和 “A” ~“F ” 之间原有的映射关系。因为他们有两个映射关系,不满足我们的条件。

具体的做法是,我们建立一张表,表中依次存储字符“0”~“F”,我们可以通过数值0~15直接查找到对应的字符。

1.3 得到子程序

子程序如下:

;用al传送要显示的数据showbyte:jmp short showtable db '0123456789ABCDEF'	;字符表show:   push bxpush esmov ah,alshr ah,1           shr ah,1shr ah,1shr ah,1			    ;右移4位,ah中得到高4位的值and al,00001111b		;al中为低4位的值mov bl,ahmov bh,0mov ah,table[bx]		;用高4位的值作为相对于table的偏移,取得对应的字符mov bx,0b800hmov es,bxmov es:[160*12+40*2],ahmov bl,almov bh,0mov al,table[bx]		;用低4位的值作为相对于table的偏移,取得对应的字符mov es:[160*12+40*2+2],alpop espop bxret

可以看出,在子程序中,我们在数值0~15和字符“0”~“F ” 之间建立的映射关系为:以数值N为table 表中的偏移,可以找到对应的字符。

1.4 反思

利用表,在两个数据集合之间建立一种映射关系,使我们可以用查表的方法根据给出的数据得到其在另一集合中的对应数据。

这样做的目的一般来说有三个:

  • (1)为了算法的清晰和简洁。

  • (2)为了加快运算速度。

  • (3)为了使程序易于扩充。

1.5 问题引入(二)—— 为加快运算速度而查表

在刚刚的子程序中,我们更多的是为了算法的清晰和简洁,而采用了查表的方法。下面我们来看一下,为了加快运算速度而采用查表的方法的情况。

任务:编写一个子程序,计算sin(x),x∈{0°,30°,60°,90°,120°,150°,180°},并在屏幕中间显示计算结果。

例如sin(30) 的结果显示为“0.5”。

1.6 分析与解决问题

1.7.1 使用麦克劳林公式

我们可以利用麦克劳林公式来计算sin(x)。 x 为角度,麦克劳林公式中需要代入弧度,则:

sin ⁡ x = sin ⁡ y ≈ y − 1 3 ! y 3 + 1 5 ! y 5 \sin x = \sin y\approx y-\frac{1}{3!} y^3+\frac{1}{5!}y^5 sinx=sinyy3!1y3+5!1y5

y = x / 180 ∗ 3.1415926 y=x/180*3.1415926 y=x/1803.1415926

可以看出,计算sin(x)需要进行多次乘法和除法。乘除是非常费时的运算,它们的执行时间大约是加法、比较等指令的5倍。

1.7.2 还是用查表简单

那么我们如何才能够不做乘除而计算sin(x)呢?

我们看一下需要计算的sin(x)的结果:

在这里插入图片描述

我们可以看出,其实用不着计算,可以占用一些内存空间来换取运算的速度。

将所要计算的sin(x) 的结果都存储到一张表中;然后用角度值来查表,找到对应的sin(x)的值。

我们用 ax 向子程序传递角度。

1.7 得到子程序

子程序如下:

showsin:jmp short showtable dw ag0,ag30,ag60,ag90,ag120,ag150,ag180	;字符串偏移地址表ag0      db '0',0			;sin(0)对应的字符串“0”ag30     db '0.5',0			;sin(0)对应的字符串“0.5”ag60     db '0.866',0		;sin(0)对应的字符串“0.866”ag90     db '1',0			;sin(0)对应的字符串“1”ag120    db '0.866',0		;sin(0)对应的字符串“0.866”ag150    db '0.5',0			;sin(0)对应的字符串“0.5”ag180    db '0',0			;sin(0)对应的字符串“0”show:   push bxpush espush simov bx,0b800hmov es,bx;以下用角度值/30 作为相对于table的偏移量,取得对应的字符串的偏移地址,放在bx中mov ah,0mov bl,30div blmov bl,almov bh,0add bx,bxmov bx,table[bx];以下显示sin(x)对应的字符串mov si,160*12+40*2
shows:  mov ah,cs:[bx]cmp ah,0je showretmov es:[si],ahinc bxadd si,2jmp showsshowret:pop sipop espop bxret

在上面的子程序中,我们在角度值x和表示 sin(x) 的字符串集合table 之间建立的映射关系为:以角度值 /30 为table 表中的偏移,可以找到对应的字符串的首地址。

1.8 反思与总结

编程的时候要注意程序的容错性,即对于错误的输入要有处理能力。

在上面的子程序中,我们还应该在加上对提供的角度值是否超范围的检测。

如果提供的角度值不在合法的集合中,程序将定位不到正确的字符串,出现错误。

对于角度值的检测,大家请自行完成。

上面的两个子程序中,我们将通过给出的数据进行计算或比较而得到结果的问题,转化为用给出的数据作为查表的依据,通过查表得到结果的问题。

具体的查表方法 ,是用查表的依据数据 ,直接计算出所要查找的元素在表中的位置。像这种可以通过依据数据,直接计算出所要找的元素的位置的表,我们称其为:直接定址表

2. 程序入口地址的直接定址表

我们可以在直接定址表中存储子程序的地址,从而方便地实现不同子程序的调用。

2.1 问题引入

实现一个子程序setscreen ,为显示输出提供如下功能:

  • (1)清屏。

  • (2)设置前景色。

  • (3)设置背景色。

  • (4)向上滚动一行

2.2 设置入口参数

那么入口参数如何设置呢?

入口参数说明:

  • (1)用ah寄存器传递功能号:0 表示清屏,1表示设置前景色,2 表示设置背景色,3 表示向上滚动一行;

  • (2)对于2、3号功能,用al传送颜色值,(al)∈{ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 }。

2.3 各功能的实现

下面,我们讨论一下各种功能如何实现:

  • (1)清屏:将显存中当前屏幕中的字符设为空格符

  • (2)设置前景色:设置显存中当前屏幕中处于奇地址的属性字节的第0、1、2位;

  • (3)设置背景色:设置显存中当前屏幕中处于奇地址的属性字节的第4、5、6位;

  • (4)向上滚动一行:依次将第 n+1行的内容复制到第n行处:最后一行为空。

2.4 各功能的子程序

我们将这4 个功能分别写为 4 个子程序,请大家根据编程思想,自行读懂下面的程序。

;功能子程序1:清屏
sub1:   push bxpush cxpush esmov bx,0b800hmov es,bxmov bx,0mov cx,2000sub1s:  mov byte ptr es:[bx],' 'add bx,2loop sub1spop espop cxpop bxret ;sub1 ends;功能子程序2:设置前景色
sub2:	push bxpush cxpush esmov bx,0b800hmov es,bxmov bx,1mov cx,2000sub2s:	and byte ptr es:[bx],11111000b	or es:[bx],al add bx,2loop sub2spop espop cxpop bxret ;sub2 ends;功能子程序3:设置背景色
sub3:	push bxpush cxpush esmov cl,4shl al,clmov bx,0b800hmov es,bxmov bx,1mov cx,2000sub3s:	and byte ptr es:[bx],10001111bor es:[bx],al add bx,2loop sub2spop espop cxpop bxret ; sub3 ends;功能子程序4:向上滚动一行
sub4:	push cxpush sipush dipush espush dsmov si,0b800hmov es,simov ds,simov si,160			;ds:si指向第n+1行mov di,0			;es:di指向第n行cldmov cx,24			;共复制24行sub4s:	push cxmov cx,160rep movsb 			;复制pop cxloop sub4smov cx,80	mov si,0sub4s1: mov byte ptr es:[160*24+si],' '		;最后一行清空add si,2loop sub4s1pop dspop espop dipop sipop cxret ;sub4 ends

2.5 使用直接定址表调用子程序

我们可以将这些功能子程序的入口地址存储在一个表中,它们在表中的位置和功能号相对应。

对应的映射关系为:功能号*2=对应的功能子程序在地址表中的偏移。

程序如下:

setscreen: jmp short settable  dw sub1,sub2,sub3,sub4set:	push bx	cmp ah,3		;判断传递的是否大于 3ja sretmov bl,ahmov bh,0add bx,bx		;根据ah中的功能号计算对应子程序的地址在table表中的偏移call word ptr table[bx]	;调用对应的功能子程序sret:	pop bx	iret

当然,我们也可以将子程序setscreen如下实现:

setscreen:cmp ah,0je do1cmp ah,1je do2cmp ah,2je do3cmp ah,3je do4jmp short sret do1:	call sub1jmp short sretdo2:	call sub2jmp short sretdo3:	call sub3jmp short sretdo4:	call sub4sret:	iret

2.6 总结

显然,用通过比较功能号进行转移的方法,程序结构比较混乱,不利于功能的扩充。比如说,在 setscreen 中再加入一个功能,则需要修改程序的逻辑,加入新的比较、转移指令。

用根据功能号查找地址表的方法,程序的结构清晰,便于扩充。如果加入一个新的功能子程序,那么只需要在地址表中加入它的入口地址就可以了

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述

相关文章:

【汇编语言】直接定址表(二)—— 「代码‘导航员’:直接定址表的功能与应用」

文章目录 前言1. 直接定址表1.1 问题引入(一)—— 为算法清晰而查表1.2 分析与解决问题1.2.1 两个十六进制表示一个字节1.2.2 得到数值对应的数码字符1.2.2.1 最粗暴的方法——比较1.2.2.2 使用映射关系来解决1.2.2.3 存在的问题及解决 1.3 得到子程序1.…...

05vue3实战-----配置项目代码规范

05vue3实战-----配置项目代码规范 1.集成editorconfig配置2.使用prettier工具2.1安装prettier2.2配置.prettierrc文件:2.3创建.prettierignore忽略文件2.4VSCode需要安装prettier的插件2.5VSCod中的配置2.6测试prettier是否生效 3.使用ESLint检测3.1VSCode需要安装E…...

不含101的数

不含101的数 真题目录: 点击去查看 E 卷 200分题型 题目描述 小明在学习二进制时,发现了一类不含101的数: 将数字用二进制表示,不能出现 101 。 现在给定一个整数区间 [l,r] ,请问这个区间包含了多少个不含 101 的数&#xff…...

Linux/C高级(精讲)----shell结构语句、shell数组

shell脚本 功能性语句 test 可测试对象三种:字符串 整数 文件属性 每种测试对象都有若干测试操作符 1)字符串的测试: s1 s2 测试两个字符串的内容是否完全一样 s1 ! s2 测试两个字符串的内容是否有差异 -z s1 测试s1 字符串的长度是…...

基于微信小程序的消防隐患在线举报系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

java基础2(黑马)

一、变量里的数据在计算机中的存储原理 1.二进制 .二进制:只有0、1, 按照逢二进一的方式表示数据。 十进制数字11转换为:1011 方法:除二取余法 计算机中表示数据的最小单元,一个字节(Byte,简…...

计算机中数值表示:原码、反码、补码与移码

1 前言 计算机科学中,数字的表示方式至关重要,因为计算机内部只能识别处理二进制数据。为了在计算机中实现对整数的表示,提出了多种数值编码方式,其中最常用的是原码、反码、补码和移码。 2 原码 2.1 原码的定义 原码(Signed …...

1.8 组合模式(Composite Pattern)

定义 组合模式(Composite Pattern) 是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式让客户端可以以相同的方式对待单个对象和对象集合。组合模式使得客户可以统一处理树形结构中的单个对象和对象的集合…...

QFileDialog::getOpenFileName(this,“文件对话框“,“.“,“c++ files(*.cpp);;“); 文件对话框显示乱码

在使用 QFileDialog::getOpenFileName 时,如果文件对话框显示乱码,通常是因为编码问题。Qt 默认使用 UTF-8 编码,但如果你的系统或源代码文件的编码不一致,可能会导致乱码。 以下是几种可能的解决方法: 1. 确保源代码…...

【C语言系列】深入理解指针(5)

深入理解指针(5) 一、sizeof和strlen的对比1.1sizeof1.2strlen1.3sizeof和strlen的对比 二、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1代码1:2.2.2代码2:2.2.3代码3:2.2.4代码4:2.2.5代码5&#…...

为什么使用nohup 和 启动的python脚本,日志没有在nohup.out中

当你使用 nohup 和 & 启动 Python 脚本时,输出通常会被重定向到 nohup.out 文件,但是有几个原因可能导致日志没有出现在这个文件中: Python 程序的输出被重定向了: 如果你的 Python 脚本中使用了 sys.stdout 或 sys.stderr 进…...

MySQL的存储引擎对比(InnoDB和MyISAM)

InnoDB 特点: 事务支持:InnoDB 是 MySQL 默认的事务型存储引擎,支持 ACID(原子性、一致性、隔离性、持久性)事务。行级锁定:支持行级锁,能够并发执行查询和更新操作,提升多用户环境…...

uniapp访问django目录中的图片和视频,2025[最新]中间件访问方式

新建中间件, middleware.py 匹配,以/cover_image/ 开头的图片 匹配以/episode_video/ 开头的视频 imageSrc: http://192.168.110.148:8000/cover_image/12345/1738760890657_mmexport1738154397386.jpg, videoSrc: http://192.168.110.148:8000/episode_video/12345/compres…...

Python递归复习题

寒假打卡第二十一天&#xff0c;当前mit6.100L进度(16/26) &#xff0c;今天补一下递归复习题。 问题1&#xff1a;编写一个递归程序来计算正和n&#xff08;n-2&#xff09;&#xff08;n-4&#xff09;的整数&#xff08;直到且不包括n-x<0&#xff09; def sum_series(n…...

2025 年前端开发趋势展望,开启新征程

新年伊始&#xff0c;作为一名深耕 Web 前端开发领域的博主&#xff0c;我迫不及待地想和大家分享我对 2025 年前端开发趋势的洞察。过去一年里&#xff0c;前端领域的技术创新和变革令人目不暇接&#xff0c;而新的一年&#xff0c;更是充满无限可能。 框架与工具的持续演进 …...

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…...

Redis --- 使用GEO实现经纬度距离计算

什么是GEO&#xff1f; Spring Boot 项目中可以通过 Spring Data Redis 来使用 Redis GEO 功能&#xff0c;主要通过 RedisTemplate 和 GeoOperations 接口来操作地理位置数据。 Service public class GeoService {Autowiredprivate RedisTemplate<String, Object> red…...

同步 CDC

同步 CDC 当设计包括来自同一 MMCM/PLL 的时钟之间的同步 CDC 路径时&#xff0c;您可以使用以下技术来更好地控制时钟插入延迟和 时滞&#xff0c;并因此控制这些路径上的松弛。 重要提示&#xff1a; 如果 CDC 路径在源自不同 MMCM/PLL 的时钟之间&#xff0c;则跨越 …...

Linux环境下载Ollama慢或卡顿解决方案

一、下载方式 官方下载方式是到ollama官网下载ollama: https://ollama.com/ 复制下载链接执行&#xff1a; curl -fsSL https://ollama.com/install.sh | sh二、卡顿现象 执行后经常会出现下载失败或者进度条特别慢的情况&#xff0c;甚至直接退出下载&#xff1a; 三、…...

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)

今天小李哥将开启全新的技术分享系列&#xff0c;为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测&#xff0c;到2025年全球 AI 安全解决方案市场规模将突破200亿美元&#xff0c;年复合增长率超过30%&#xff0c;而Gartn…...

2025年家用音响市场分析:潜力无限,音质为王的新纪元

引言&#xff1a;音质革命引领市场新风尚 在数字化浪潮的推动下&#xff0c;家用音响市场正经历一场前所未有的变革&#xff0c;其增长潜力犹如破晓之光&#xff0c;照亮了音频技术的未来之路。随着消费者对高品质生活追求的不断提升&#xff0c;以及对智能家居生态融合的日益…...

neo4j-在Linux中安装neo4j

目录 切换jdk 安装neo4j 配置neo4j以便其他电脑可以访问 切换jdk 因为我安装的jdk是1.8版本的&#xff0c;而我安装的neo4j版本为5.15,Neo4j Community 5.15.0 不支持 Java 1.8&#xff0c;它要求 Java 17 或更高版本。 所以我需要升级Java到17 安装 OpenJDK 17 sudo yu…...

AI 场景下,函数计算 GPU 实例模型存储最佳实践

作者&#xff1a;有松 当前&#xff0c;函数计算 FC 已被广泛应用在各种 AI 场景下&#xff0c;函数计算支持通过使用容器镜像部署 AI 推理应用&#xff0c;并且提供多种选项来访问训练好的模型。为了帮助开发者高效地在函数计算上部署 AI 推理应用&#xff0c;并快速解决不同…...

股指入门:股指期货是什么意思?在哪里可以做股指期货交易?

股指期货是一种以股票指数为标的物的期货合约&#xff0c;也可以称为股票指数期货或期指。 股指期货是什么意思&#xff1f; 股指期货是一种金融衍生品&#xff0c;其标的资产是股票市场上的股指&#xff0c;例如标普500指数、道琼斯工业平均指数、上证50指数等。 股指期货允…...

【分布式理论六】分布式调用(4):服务间的远程调用(RPC)

文章目录 一、RPC 调用过程二、RPC 动态代理&#xff1a;屏蔽远程通讯细节1. 动态代理示例2. 如何将动态代理应用于 RPC 三、RPC 序列化四、RPC 协议编码1. 协议编码的作用2. RPC 协议消息组成 五、RPC 网络传输1. 网络传输流程2. 关键优化点 一、RPC 调用过程 RPC&#xff08…...

aliyun 的 ip 设置方法

aliyun 的 ip 设置方法 阿里云&#xff1a;网络编程 bind&#xff1a;cannot assign requested address errno:99 问题。 公网IP,&#xff0c;弹性公网IP&#xff0c;主私网IP 1. 公网IP, --> NAT --> 主私网IP &#xff0c;设置方法&#xff1a; 服务器端 ip 为&…...

ASP.NET Core分布式缓存

目录 分布式缓存 概述 IDistributedCache接口中定义的主要方法及主要的扩展方法 用什么做缓存服务器 使用 封装分布式缓存操作 分布式缓存 概述 分布式系统中&#xff0c;内存缓存不满足要求的话&#xff0c;把缓存数据保存到专门的缓存服务器&#xff0c;所有Web应用通…...

【CUDA】内存模型

目录 一、Programmable 1.1 寄存器(Registers) 1.2 本地内存(Local Memory) 1.3 共享内存(shared Memory) 1.4 常量内存(Constant Memory) 1.5 全局内存(Global Memory) 1.6 纹理内存(Textrue Memory) 1.7 总结 二、Cache(Non-programmable) 三、固定内存 四、零拷贝…...

使用Pygame制作“吃豆人”游戏

本篇博客展示如何使用 Python Pygame 编写一个简易版的“吃豆人&#xff08;Pac-Man&#xff09;” 风格游戏。这里我们暂且命名为 Py-Man。玩家需要控制主角在一个网格地图里移动、吃掉散布在各处的豆子&#xff0c;并躲避在地图中巡逻的幽灵。此示例可帮助你理解网格地图、角…...

Pyecharts系列课程04——折线图/面积图(Line)

本章我们学习在Pyecharts中折线图&#xff08;Line&#xff09;的使用。折线图通用应用于数据的趋势分析。 折线图 我们现在有两组数据&#xff0c;x_data是2024年的月份&#xff0c;y_data为对应张三甲每个月的用电量。 # 家庭每月用电量趋势 x_data ["1月", &q…...

mysql 学习10 多表查询 -多表关系,多表查询

多表关系 一对多 多对多 创建学生表 #多对多表 学生选课系统create table student(id int primary key auto_increment comment 主键ID,name varchar(64) comment 姓名,studentnumber varchar(10) comment 学号 )comment 学生表;insert into student(id,name,studentnumber)va…...

lambda 表达式详解

lambda 表达式详解 lambda 表达式详解基本语法示例代码及详细解释1. 简单的lambda表达式2. 带参数的lambda表达式3. 捕获外部变量4. 使用mutable关键字修改捕获的变量5. 按引用捕获外部变量6. 自动推导返回类型 捕获列表的几种形式总结 Lambda表达式的常用的应用场景&#xff1…...

从0开始达芬奇(3.5)

媒体优化 顾名思义就是降低分辨率等来使素材的回放更加流畅。&#xff08;在低配电脑上也可以流畅运行&#xff09; ⭐方法一&#xff1a;&#xff08;一般使用第二种&#xff09; 播放→代理模式→二分之一或者四分之一 ⭐⭐⭐方法二&#xff1a;优化媒体文件&#xff08;简…...

【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据

一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址&#xff1a; https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动&#xff0c;会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…...

Ubuntu20.04 本地部署 DeepSeek-R1

一、下载ollama 打开 ollama链接&#xff0c;直接终端运行提供的命令即可。如获取的命令如下&#xff1a; curl -fsSL https://ollama.com/install.sh | sh确保是否安装成功可在终端输入如下命令&#xff1a; ollama -v注意&#xff1a; 如遇到Failed to connect to github.…...

Linux 设备驱动分类(快速理解驱动架构)

Linux 设备驱动分类&#xff08;快速理解驱动架构&#xff09; 在 Linux 设备驱动开发中&#xff0c;最基础的概念就是 设备驱动的分类。 Linux 设备驱动主要分为 字符设备、块设备和网络设备&#xff0c;它们分别对应不同类型的硬件资源。 理解这些分类&#xff0c;不仅能帮助…...

Java语法糖详解

前言 在现代编程语言的发展历程中&#xff0c;语法糖&#xff08;Syntactic Sugar&#xff09;作为一种提升代码可读性和开发效率的重要特性&#xff0c;已经成为语言设计的重要组成部分。Java作为一门成熟且广泛应用的编程语言&#xff0c;在其长期演进过程中&#xff0c;语法…...

567.字符串的排列

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 用两个哈希表比较来判断。s1的哈希表是否与s2相同。在窗口滑动过程中&#xff0c;用哈希表来维护。 2.2 代码尝试 class Solution { pub…...

DB2和mysql关于表和索引是否需要reorg的研究

DB2&#xff1a; DB2有个reorgchk的命令&#xff0c;是从SYSSTAT.TABLES和syscat.indexes这两个系统表中查表和索引的信息&#xff0c;并给出是否需要reorg表和索引的建议。 [db2inst1t3-ucm-ucm-rdb ~]$ db2 reorgchk CURRENT STATISTICS on table DB2ADMIN.ACAGENTTREE Ta…...

【Linux系统编程】:自旋锁,读写锁

文章目录 前言1. POSIX自旋锁1.1.定义自旋锁1.2.初始化1.3. 加锁1.4. 尝试加锁操作1.5. 解锁操作1.6. 销毁操作1.7.示例1.8.优缺点优点缺点 1.9.适用场景 2. 读写锁2.1 读写锁的工作原理2.2 读写模型2.3 常用接口2.3.1 定义锁并初始化2.3.2 申请读锁2.3.3 申请写锁2.3.4 解锁2.…...

位运算及常用技巧

涉及位运算的运算符如下表所示&#xff1a; 位运算的运算律&#xff1a; 负数的位运算 首先&#xff0c;我们要知道&#xff0c;在计算机中&#xff0c;运算是使用的二进制补码&#xff0c;而正数的补码是它本身&#xff0c;负数的补码则是符号位不变&#xff0c;其余按位取反…...

Chrome 浏览器:互联网时代的浏览利器

Chrome 浏览器&#xff1a;互联网时代的浏览利器 引言 在互联网时代&#xff0c;浏览器已经成为我们日常生活中不可或缺的工具。作为全球最受欢迎的浏览器之一&#xff0c;Chrome 浏览器凭借其出色的性能、丰富的扩展程序和简洁的界面&#xff0c;赢得了广大用户的喜爱。本文…...

web-文件上传-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…...

【react】react面试题

react面试题 对 React 的理解、特性 react18有哪些更新 JSX是什么 解释为什么浏览器不能读取jsx ReactNative中&#xff0c;如何解决8081端口被占用而提示无法访问的问题&#xff1f; React 生命周期 react事件机制 react 组件传值 React改变state的方式 re…...

逐笔成交逐笔委托Level2高频数据下载和分析:20250206

Level2逐笔成交逐笔委托数据分享下载 通过Level2逐笔成交和逐笔委托这种每一笔的毫秒级别的数据可以分析出很多有用的点&#xff0c;包括主力意图&#xff0c;虚假动作&#xff0c;让任何操作无所遁形。适合交易大师来分析主力规律&#xff0c;也适合人工智能领域的机器学习&a…...

__cvta_generic_to_shared

一 测试代码 #include <cuda_runtime.h> #include <cstdio> #include <cstdint>__global__ void test_cp_async(int* __restrict__ A,int* __restrict__ B){int tid = threadIdx.x;A[tid] = tid;__shared__ int smem[32];size_t smemAddr = __cvta_generic_…...

C++学习——缺省参数、重载函数、引用

目录 前言 一、缺省参数 1.1概念 1.2写法 1.3半缺省 1.4使用 二、重载函数 2.1.概念 2.2类型 2.3参数 2.4顺序 2.5问题 2.6原理 三、引用 1、引用是什么&#xff1f; 2、引用的使用方法 3、引用特性 1、引用在定义的时候必须要初始化 2、一个变量会有多个引用…...

docker-compose 配置nginx

前言 前端打包的dist文件在宿主机&#xff0c;nginx运行在docker-compose 问题 nginx.conf 在本地配置可以生效&#xff0c;但是链接到容器就报错 基于本地的nginx运行&#xff0c;本地nginx.conf 如下 server {listen 8081;location / {root /usr/local/software/testweb/…...

LQB(0)-python-基础知识

一、Python开发环境与基础知识 python解释器&#xff1a;用于解释python代码 方式&#xff1a; 1.直接安装python解释器 2.安装Anaconda管理python环境 python开发环境&#xff1a;用于编写python代码 1.vscode 2.pycharm # 3.安装Anaconda后可以使用网页版的jupyter n…...

【C语言】指针运算与数组关系:详细分析与实例讲解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;1. 指针的基础运算1.1 指针的加减运算1.2 指针加整数与指针减整数1.3 指针与指针的运算 &#x1f4af;2. 指针的实际应用&#xff1a;模拟 strlen 函数2.1 使用指针模拟…...