【编程实践】黑框框里的打字小游戏,但是汇编语言

2023-10-10 更新
续:将基于Nasm汇编的打字小游戏,移植到DOSBox

开始:

在学习王爽的《汇编语言》的过程中,我就真切地体会到编程实践对于理解的帮助。起初我没有安装书中的实验环境,看到100页左右就开始感觉无趣、吃力,看了后面忘前面,差点就要放弃这本书的学习。好在我后来还是装好了环境,这才开始在实际的编程练习中感受到一些乐趣。

学习完《汇编语言》一书后,我又开始阅读朋友给我推荐的《x86汇编语言 从实模式到保护模式》。没错,王爽书介绍的只是实模式下编程的内容。读x86一书过程中,前面接近于复习,读起来还比较轻快,但随着渐渐深入,我每次对照书阅读代码都感觉很是吃力。到了第15章“程序的动态加载和执行”时,已经常常会将保护模式和前面实模式中的内容搞混。

于是我决定自己设计并编写一个汇编程序,以进一步理顺清晰前面所学习的内容——本文便缘起于此。需要声明的一点是,我并没有打算将这个程序做成一个教程,因为那好累,我有点懒。前面一小段内容算是我的日记,后面则是笔记。

但如果真的有人对我的程序或代码感兴趣,我也在后面提供了我的代码仓库链接,欢迎大家下载我的代码。然而你想运行它确实会有点麻烦,同样的在后面我也大致介绍了程序的运行环境。

Gitee源代码仓库:清风莫追/Typing_asm (gitee.com)

文章目录

  • 开始:
  • 介绍
    • 1 程序简述
    • 2 涉及知识
    • 3 运行环境
  • 程序结构
  • 复习知识点
    • 1 常数定义
    • 2 用户程序中段的重定位
    • 3 关于vstart的三种情况
    • 4 显存模块
    • 5 命令行编译源代码
    • 6 中断向量表
    • 7 退出VBox对鼠标和键盘的独占
    • 8 发布到Gitee
  • 指令记录
    • 1 伪指令
    • 2 其它
  • Bug记录
    • 1 主引导扇区程序未成功加载用户程序
    • 2 安装的int 9中断例程未正常运行
    • 3 按一个键后,生成字符串的程序的不动了
    • 4 按下字母变绿失效:当数据段加个字节
    • 5 伪随机数循环了
    • 6 数字显示不出来
    • 7 环绕模块卡死

介绍

1 程序简述

如果只允许用四个字来概括我的程序,那我只能对你说:打字游戏。可很遗憾今天的我有点话痨,请允许我更详细地描述一下这个小游戏:

运行程序后,首先映入你眼帘的会是一个干净的黑框框。什么?你问我怎么不做个哪怕简单点的导引界面?其实原因你猜得到:懒。那么,接着你需要任意地按下一个键,这个程序就要正式开始了。

屏幕顶部会开始在随机的位置掉下随机的大写字母,而且总会有个字母被一圈+环绕着,不要犹豫,它就是你的目标,请按下对应的字母键吧!如果你按下了正确的字母,它就会变成绿色,同时屏幕的左下角会默默地记录着你的得分。描述到这里就结束了,毕竟它本就只是一个简单的小程序。

下面是我录制的一段程序运行时的GIF:

请添加图片描述

2 涉及知识

程序看着简单,玩起来也简单,但做起来可难了!而且最难的地方就是,我需要使用汇编语言来完成它,以至于它的源代码多达500行。关于指令的知识,我就不展开说了。除了会使用基本的指令外,想要写出本程序你还需要了解以下方面的知识:

  1. 显存操作。在汇编语言中,我们通过直接往显存写入数据,来让它显示我们想要的内容。与此同时你还需要了解ascii编码和字符的显示属性。
  2. 中断。你需要知道如何在系统中安装我们自己编写的中断例程,以及键盘扫描码相关的内容。
  3. 程序的加载。程序编译好后,首先是写入到磁盘里的,如何将它加载到内存中并运行?如果你是编写一个在Dos操作系统上运行的汇编程序,其实不需要这一步。但我将程序运行在一个没有操作系统的虚拟机裸机上,就需要了。

除了上面三点,我还使用“线性同余法”,用汇编实现了伪随机数的功能。不然,随机的字母、随机的下落位置,其中的随机从何而来呢?汇编并不像C语言那样有着丰富的库函数。

当然,BIOS中也是提供了一些中断例程以供用户调用的,我并不知道里面有没有随机数的功能。然而,自己尝试实现一个也挺有意思的,不是吗?这费不了多少功夫——如果你没有花很多时间调试bug的话。

3 运行环境

1、汇编语言

因为与计算机硬件实现的强相关性,汇编语言并不像其它高级语言那样标准统一。也就是说,存在多种不同的汇编语言,它们各自对应着不同的指令系统、体系结构。

好吧,其实没必要讨论那么多概念,我只是想说,本程序使用的是8086汇编语言。更进一步地说,我使用了Nasm编译器,该编译器是开源的,你可以在GitHub上找到它,而另一款大家常用的编译器是Masm

主要是伪指令的不同会导致一些代码框架结构上的差异,如果你以前只用过Masm,可能还需要去单独了解一些Nasm的内容。

2、虚拟环境

最简单的环境搭建是使用DOSBox,它是一个包含Dos操作系统的虚拟机,可以运行8086的汇编代码。如果你打算用它的话,我的代码需要进行一些修改才能运行。

说实在用DOSBox学习汇编语言挺方便的,然而它并没有提供虚拟的磁盘,后来我安装了VisualBoxBochs,《…从实模式式到保护模式》的书籍配套资料中有相关的安装教程(包括Nasm编译器):

http://www.lizhongc.com/

Bochs除了运行程序,还能debug;而VisualBox只能运行程序,效率要高一些。这两个虚拟机都没有操作系统,所以你要自己想办法将程序从磁盘加载到内存中来,这就是为什么前面“涉及的知识”中会说到程序的加载问题。

我的代码仓库中有两个.asm文件,其中程序typing_mbr.asm所做的事情就是把用户程序(也就是我的小游戏)加载到内存中,而typing.asm是真正的游戏程序代码。

- typing.asm
- typing_mbr.asm

Gitee源代码仓库:清风莫追/Typing_asm (gitee.com)

好吧,如果只是想用汇编语言编写并运行一个小游戏,这确实多走了不少弯路。也许我有空会尝试出个DOSBox中能跑的版本,但大概率会鸽,因为我懒。


最后还得吐槽一下,汇编语言的生产力太低了,这个小程序花了我整整16个小时。不过复习的效果感觉也不错,只是,我也不太确定是否划算。可是自己制作小作品时的那种投入感,是平常阅读(技术)书籍的过程中难以找到的。

接下来的部分是我编写代码过程中的一些笔记,就比较无聊了,Bug记录部分倒也可以参考一下。但我就不陪大家一起了,有缘再见!


程序结构

- 主引导程序:将用户从磁盘加载到内存中。
- 用户程序- 头部- 程序长度- 程序入口- 段重定位表- 代码段- 数据段

主引导程序包含信息:

  1. 用户程序在磁盘的位置,即起始逻辑扇区号。
  2. 用户程序被加载到内存的物理起始地址。

需要用到的例程:

显示

  1. 显示一个字母
  2. 将屏幕一行内容左移一位

键盘中断

  1. 获取键盘字符的扫描码

时钟中断

  1. 控制字符移动速度
  2. 作为随机数种子(已鸽,目前采用固定种子:1)

障碍:屏幕移动与响应键盘中断是两个线程吗?

  • 答:不需要,重写键盘中断即可。

复习知识点

1 常数定义

hello equ 100

定义一个值为100的常数hello,若继续mov ax,hello,则执行后ax寄存器的值为100。

在代码中引用常数或标号,都是在编译阶段发挥作用。但注意与标号使用时相区分,如果是hello db 100,然后mov ax,hello,则执行后ax的值为标号hello处的汇编地址

2 用户程序中段的重定位

SECTION header vstart=0                     ;定义用户程序头部段 program_length  dd program_end          ;程序总长度[0x00];用户程序入口点code_entry      dw start                			;偏移地址[0x04]dd section.code_1.start 			;段地址[0x06] realloc_tbl_len dw (header_end-code_1_segment)/4	;段重定位表项个数[0x0a];段重定位表           code_1_segment  dd section.code_1.start ;[0x0c]code_2_segment  dd section.code_2.start ;[0x10]data_1_segment  dd section.data_1.start ;[0x14]data_2_segment  dd section.data_2.start ;[0x18]stack_segment   dd section.stack.start  ;[0x1c]header_end:

如果使用主引导扇区加载用户程序,则用户程序需要描述头部信息。头部代码示例如上,记录的每个段的信息都是汇编地址,在主引导扇区程序中会转换为在物理内存中的段地址,以便之后用户程序可以通过

mov ax, [cs:data_1_segment]
mov ds, ax

这样的方式,在内存中正确地访问到对应的段。

3 关于vstart的三种情况

略了

4 显存模块

常用的是显存的文本模式,物理地址空间为0xB800~0xBFFFF。可以显示25行,每行80个字符,使用ASCII码。

5 命令行编译源代码

nasm -f bin exam.asm -o exam.bin

-f bin是要求nasm生成“纯二进制”的内容,即不包含操作系统所需要的加载和重定位信息。

6 中断向量表

对于8080PC机,中断向量表存放在0000:0000~0000:03FF的一共1024个内存单元中,每个表项占两个字,故最多可以有256个中断例程。表项中是中断处理程序的入口地址,其中高地址字存放段地址,低地址字存放偏移地址。

注:中断号从0开始。

一般0000:0200~0000:02FF这段内存是空闲的,操作系统和其他应用程序都不占用。

7 退出VBox对鼠标和键盘的独占

右边的组合键:Alt + Ctrl(按左边的这两个键没效果)。

8 发布到Gitee

如果你使用的是vscode,且以前已经配置过与Gitee的ssh公钥连接,那么发布代码到远程Gitee仓库的步骤如下:

  1. vscode进入“源代码管理”栏,初始化仓库,并提交所有更改。
  2. 登录Gitee账号,创建一个空的仓库,并复制仓库地址。
  3. 在vscode中“添加远程存储库”,然后输入仓库地址以及仓库名。
  4. 最后,发布分支。此时点开Gitee仓库,将看到你的代码已经被上传。

在这里插入图片描述

指令记录

1 伪指令

section.段名称.start

获取段的汇编地址。注意与段地址的概念相区分, 段地址 ∗ 16 段地址*16 段地址16得到的才是段的汇编地址。

2 其它

jmp far [0x04]

从内存中取出两个字,低地址的字放入IP寄存器,高地址的字放入CS寄存器。

Bug记录

1 主引导扇区程序未成功加载用户程序

在没有操作系统的虚拟机上,目前我每次运行都会启动两个程序,一个是主引导扇区程序,它用于将用户程序从磁盘加载到内存中;另一个就是我们用来完成任务的用户程序了。

当在加载阶段就出现问题时,我习惯性地就认为是主引导程序的代码出现了问题,而实际上加载用户程序的任务是由引导程序与用户程序的头部合作完成的

举个例子,我在用户程序的头部定义了用户程序的长度信息

;头部: 用户程序长度
program_length dd program_end       ;[0x00];栈段
SECTION stack align=16 vstart=0 ;...程序结尾 
program_end:

2 安装的int 9中断例程未正常运行

下面是程序的部分代码片段:

int9_new:;说明:新的int 9中断例程,在屏幕固定位置显示按下的字符push dxpush ax mov al, 'k'
SECTION data align=16 vstart=0text db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'int9_new_store db 512 dup 0     ;存放新的int 9中断例程

程序运行后会自动逐个字符得显示text标号处的内容,我将mov al,'k'修改为mov al,'e'后,显示的内容也响应地变化,说明新的中断例程代码肯定是被成功写入到了data数据段的。

在这里插入图片描述

那么不能正常运行的可能原因如下:

  • 中断向量表填写不正确。又分为新中断例程表项,和旧int 9中断例程的表项。
  • int 9中断其实不会在按键盘时自动触发?

经过两小时的调试都没能发现问题所在,已经开始怀疑是不是VisualBox和Bochs不支持键盘中断、或者中断号并不是0x09,毕竟现在换成了虚拟的x86处理器,而不是之前看王爽书时用的8086处理器了。(期间我将王爽书的实验15代码改编后,在Bochs上也无法正常运行,暂时还不知道原因)

但搜索资料发现键盘中断的支持和中断号都应该是没有问题的:

一文讲透!Windows内核 & x86中断机制详解 - 知乎 (zhihu.com)

可后来我发现了一个现象:

代码正在Bochs运行时,我随便按下一个键,程序都会突然终止。而将新中断例程改写成以下样子后,它是可以正常运行的!按键后屏幕的左上角意料之外地正常出现了小写的字母k

int9_new:;说明:新的int 9中断例程,在屏幕固定位置显示按下的字符push ax push esmov ax,0xb800 mov es,ax mov byte es:[0], 'k'pop espop ax iret

那么很显然,之前的问题应该来自我编写的新中断例程本身

我之前在中断例程中使用了形如call appear_char的指令,而appear_char是我编写在用户程序中的子程序。那么问题来了,call 标号指令采用的是相对近调用,编译后指令的操作数是call指令相对于标号的偏移量。可是,中断程序中cs寄存器的值已经改变,哪里还找得到原来的子程序appear_char?只能按着原来编译出来的偏移量,跳转到一个莫名的位置罢了。

可能的解决方案:

  1. 将用户程序和中断例程共用的子程序,同样安装为中断例程。

  2. 在内存中保存用户程序的cs段地址,中断例程中使用call far进行间接绝对远调用

    问题:子程序采用ret返回,只能实现近转移,从中断例程中调用之后就回不来了。

  3. 将需要用到的子程序源码复制拷贝到中断例程中。(有点无脑,但看起来很方便)

  4. 我之前在数据段准备了一段空间用来安装(复制)中断例程,现在想来完全多此一举。我直接将用户程序代码段的int9_new地址填入中断向量表,就可以作为中断例程了。

    由于和用户程序本来就在同一个段,调用其中的子程序肯定也没啥问题。(Good idea!)

成功解决!

3 按一个键后,生成字符串的程序的不动了

参考王爽第17章,关于键盘缓冲区的介绍。(p300)

按下字符键会产生键盘中断并将字符的通码和ascii码写入字符缓冲区中,而使用int 0x16中断例程可以从键盘缓冲区中取出一个键盘输入。但问题是,只有按下按键时会产生int 9中断吗?不,松开时也会产生一个中断,不要忘了每个键都对应这一个通码和一个断码

于是,每按下一个键并松开的过程如下:

  • 按键中断,将键盘输入写入缓冲区 --> 从缓冲区读取一个键盘输入 --> 松开中断 --> int 0x16因读取不到键盘输入,进入等待

经过尝试,如果按下一个键之后不松开,继续按第二个、第三个键,生成字符串的程序不受影响,继续运行。

int 128         ;在安装本中断前,已将旧int 9的中断号修改为128
mov ah,0 
int 0x16        ;(ah)=扫描码, (al)=ascii码mov dh,24
mov dl,79
call put_char

可能的解决方案:

  1. 自己从端口读取扫描码,然后解析为ascii码,就不会有等待的过程了。可以采用查表。

成功解决!

4 按下字母变绿失效:当数据段加个字节

我在记录头字母的标号后,添加了一个字节定义random_seed db ...,然后前面能跑的按键模块功能突然就寄了。

;...数据段中
head_letter db 0       ;持续记录屏幕上当前最左侧字母的位置(行内偏移)
random_seed db 0x4f    ;以此生成下一个随机数,每次生成后会更新

发现问题在这里:

mov bx,[head_letter]
mov es:[0xa0*12 + bx + 1], ah       ;将头字符的属性修改为绿色

因为目的操作数是bx,因此从有效地址处取出两个字节,即将random_seed处的字节放到了bx的高字节bh中。

5 伪随机数循环了

参考:随机数大家都会用,但是你知道生成随机数的算法吗? - 知乎 (zhihu.com)

起初使用的是平方取中法,但总是很容易陷入短循环,参数调了几次(循环右移多少位后取右8位)仍然效果极差。

在这里插入图片描述

后面感觉在汇编中观察数据的随机性,还是太抽象了。于是我改用了python,尝试了线性同余法 x = ( a ∗ x + b ) % c x=(a*x+b)\%c x=(ax+b)%c,取参数组合为 ( a = 217 , b = 11 , c = 253 ) (a=217,b=11,c=253) (a=217,b=11,c=253) 。生成散点图如下左图,横轴是次数,纵轴是生成的随机数值。可以很明显地看出周期性,周期长度在100左右,对于我的小游戏差不多能用了。

将参数c修改为32768(2的15次方)后,效果如右图所示。

在这里插入图片描述

6 数字显示不出来

明明感觉代码逻辑没啥问题,pop dx取得的是待显示的一位数字的值,可数字就是显示不出来。

后发现还是字符的值与属性的问题,在显存中每个字符占一个字(即两个字节),第字节是ascii码值,高字节是显示属性。代码中mov es:[di], dx直接写入一个字,dl 是ascii值没错,但dh是零,解释成属性就是黑底黑字

好吧,原来不是没显示字符,只是显示了而我看不见。

put_one:pop dxadd dx, '0'mov es:[di], dxadd di, 2loop put_one

7 环绕模块卡死

;2 样式表surround_style显示环绕效果
mov ax, style_end - surround_style
mov bx, 2 
div bx 
mov ah,0        ;有点多余,但比较保险
mov cx,ax 

在Bochs中调试时,到div bx这一条指令就会一直卡在这里,不知道是什么情况。

在这里插入图片描述

当我将bx修改为bl后,程序可以顺畅地运行下去了。那么应该是因为dx不为0, ( d x , a x ) / b x (dx,ax)/bx (dx,ax)/bx中 bx 值太小(2),发生了除法溢出。很好,这个问题算是解决了,但又出现了一个新的问题:

kkk       kk
k k  --> k k
kkk      kkkk

也不知道这个k是怎么独自跑到下面去的。

	surround_style:db -1,-1,   -1,0,   -1,1db 0,-1,    0,1db 1,-1,    1,0,    1,1style_end:

发现了一个问题:我将相对坐标读取到dx中,高地址dh为行号,低地址dl为列号,即每一对(x,y)应该将行号写在后面,列号写在前面。虽然和我预想的方式不太一样,然而其实没有什么区别,因为都只是空缺了(0,0)这一个组合而已,无法解释最左边一列为什么会错位。

最后,我在胡乱调试中以一种我认为错误的方式,得到了我认为正确的结果

    surround_style:db -1,-2,   0,-1,   1,-1db -1,-1,   1,0,db -1,0,    0,1,    1,1style_end:

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

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

相关文章

Spring Boot(一)

Spring Boot是一个开源的Java框架,旨在简化基于Java的应用程序的开发和部署过程。它提供了许多开箱即用的功能和工具,使开发者能够快速构建独立、可执行的、生产级别的应用程序。 以下是Spring Boot的一些主要特点和优势: 简化的配置&#x…

【学习笔记】Understanding LSTM Networks

Understanding LSTM Networks 前言Recurrent Neural NetworksThe Problem of Long-Term DependenciesLSTM Networks The Core Idea Behind LSTMsStep-by-Step LSTM Walk ThroughForget Gate LayerInput Gate LayerOutput Gate Layer Variants on Long Short Term MemoryConclus…

pychon/PIL/opencv/json学习过程中遇到的问题

1. 使用PIL.Image读取图片 注意:pytorch中对图像预处理是transforms的输入必须是PIL格式的文件,使用cv2读取的图片就按照第二条的代码处理(3通道合并、归一化处理) from PIL import Image img Image.open("test1.jpg"…

◢Django 自写分页与使用

目录 1、设置分页样式,并展示到浏览器 2、模拟页码 3、生成分页 4、数据显示 5、上一页下一页 6、数据库的数据分页 7、封装分页 8、使用封装好的分页 建立好app后,设置路径path(in2/,views.in2),视图def in2(request): ,HTML: in2.html…

PCL安装与使用

1 apt安装 ubuntu20.04及以上版本下可以直接通过apt方式安装pcl编译好的二进制文件,二进制安装的版本为1.10。 sudo apt update sudo apt install libpcl-dev 2 源码安装 在pcl的github上下载对应的版本进行安装: https://github.com/PointCloudLibrary/pcl/rel…

win 命令替代鼠标的操作

操作方式都是在 winR 输入框输入或者终端输入 1、快速打开 控制面板 运行control 2、快速打开 电源选项 运行powercfg.cpl 3、快速打开 网络连接 运行ncpa.cpl 4、快速打开 程序和功能 运行appwiz.cpl 5、快速打开 Windows Defender防火墙 运行Firewall.cpl 6、快速打开 鼠标 …

EXCEL——计算数据分散程度的相关函数

一、PERCENTIL函数 1.函数介绍 通常用来返回数据集给定百分点上的值。 2.函数解读 函数公式: PERCENTILE(数据, 百分点) 参数释义: 数据(必填):待处理的数组或数据区域。 百分点(必填)&…

Python 如何实现 Command(命令)模式?什么是 Command(命令)设计模式?

什么是命令设计模式? 命令模式(Command Design Pattern)是一种行为设计模式,它将请求封装成一个对象,从而允许参数化客户端对象,排队请求,或者对请求进行操作。命令模式支持撤销操作&#xff0…

SpringCache(Redis)

一、springcache是什么 springcache是spring的缓存框架,利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了…

Clickhouse学习笔记(11)—— 数据一致性

使用合并树引擎时,无论是ReplacingMergeTree还是SummingMergeTree,都只能保证数据的最终一致性,因为数据的去重、聚合等操作会在数据合并的期间进行,而合并会在后台以一个不确定的时间进行,因此无法预先计划&#xff1…

Python实现WOA智能鲸鱼优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

永达理简析:利用保险的“财务规划”功能维持退休后生活水平

现代社会环境背景下,“自养自老”已经是一种未来养老趋势,很多人会为自己准备一份长期、比较周全的保障,这样财务规划不仅会分担子女的压力,也让自己有一个长远的保障。在各种财务储蓄工具中,商业保险占据着不可取代的…

基于连续Hopfield神经网络优化——旅行商问题优化计算

大家好,我是带我去滑雪! 利用神经网络解决组合优化问题是神经网络应用的一个重要方面。所谓组合优化问题,就是在给定约束条件下,使目标函数极小(或极大)的变量组合问题。将Hopfield网络应用于求解组合优化问…

基于php js+mysql+laravel技术架构的手术麻醉管理系统源码 手麻系统源码

PHP手术麻醉管理系统源码 手麻系统源码 手术麻醉管理系统定义: 手术麻醉系统主要是由麻醉信息管理和监护设备数据采集系统两个部分组成,主要是将麻醉信息和从监护仪器上采集到的数据以及手术信息进行统计。 手术麻醉系统是指专用于住院患者手术与麻醉…

FRC-EP系列--你的汽车数据一站式管家

FRC-EP系列产品主要面向汽车动力总成测试的客户,主要应用方向为残余总线仿真及网关。本文将详细介绍FRC-EP的产品特性和应用场景。 应用场景: 汽车电子生成研发过程中,需要对汽车各个控制器进行仿真测试,典型的测试对象有&#…

5. HTML常用标签

5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>(重要) HTML提供了…

Opentracing概念介绍——Span

文章首发公众号&#xff1a;海天二路搬砖工 引言 作为分布式跟踪系统的标准化API&#xff0c;OpenTracing提供了一种通用的方式来追踪和分析分布式系统中的请求和操作。 在Opentracing中&#xff0c;Span是基本的跟踪单元&#xff0c;用于描述在分布式系统中的一个操作或事件…

基于K7的PXIPXIe数据处理板(Kintex-7 FMC载板)

基于PXI&PXIe总线架构的高性能数据预处理FMC 载板&#xff0c;板卡具有 1 个 FMC&#xff08;HPC&#xff09;接口&#xff0c;1 个 X8 PCIe 和1个PCI主机接口&#xff1b;板卡采用 Xilinx 的高性能 Kintex-7 系列 FPGA 作为实时处理器&#xff0c;实现 FMC 接口数据的采集…

文本生成高精准3D模型,北京智源AI研究院等出品—3D-GPT

北京智源AI研究院、牛津大学、澳大利亚国立大学联合发布了一项研究—3D-GPT&#xff0c;通过文本问答方式就能创建高精准3D模型。 据悉&#xff0c;3D-GPT使用了大语言模型的多任务推理能力,通过任务调度代理、概念化代理和建模代理三大模块&#xff0c;简化了3D建模的开发流程…

如何用Jmeter对数据库执行压力测试

在我看来压力测试的压测对象可以分为UI&#xff0c;接口及数据库三个部分吧&#xff0c;对界面及接口进行压测还算熟悉&#xff0c; 定位性能瓶颈&#xff0c;对数据库SQL执行压测也是需要做的。工具呢&#xff1f;还是Jmeter 1、将需要用到的链接Oracle的架包放到jmeter中 …