汇编课设代码实战:DOSBox+MASM环境下的四个经典程序拆解

简介:一份面向北理工《汇编语言与接口技术》课程的汇编上机作业资料包,围绕大数相乘、Windows图形界面计算器、文本文件比对、贪吃蛇游戏四个典型任务展开。其中,大数相乘实现100位以上十进制大整数的乘法运算;计算器借助Windows界面编程与浮点数指令,支持浮点运算和三角函数;文本比较模块可核对两个文件内容并输出不同处的行号;贪吃蛇则呈现了游戏逻辑与键盘中断处理的综合运用。包内共241个文件,核心内容为asm汇编源码、exe可执行程序、sln/vcxproj工程文件,同时包含bmp界面图片、docx作业说明文档以及编译过程中生成的obj、pdb、tlog等辅助文件,rar压缩包仅608KB,结构紧凑,便于按项目分别对照学习。目前已有534人学习下载,既可作为北理工学生完成同类作业的参考方案,也能帮助其他汇编学习者熟悉Windows环境下的接口编程与调试方法。

1. 汇编课设资料不是用来“读”的,是用来“跑”的

你下载过汇编课设资料的话,大概见过这种画面:代码打开能看懂,注释也全,但一编译就报错,一运行就黑屏,甚至 DOSBox 里连文件都找不到。问题大多不在算法,而在工具链、段定义和数据区边界。我这次拆的是某高校《汇编语言与接口技术》课程的代码资料,里面四个可运行的汇编程序——大数相乘、计算器、文本比较、贪吃蛇——正好覆盖了 DOS 平台下算术运算、字符串处理、文件读写和 BIOS 中断四类典型场景。适合两类人:课设要交作业的学生,以及想把底层机制摸一遍的从业者。这篇文章按“环境→拆题→避坑→验证”的顺序写,帮你把这份资料变成自己真能复现、能改的东西。

2. 环境与工具链:DOSBox、MASM 6.11 和再也不能少的段定义

2.1 为什么用 DOSBox + 传统汇编器,而不是直接开 IDE

汇编课设代码基本都是 8086 时代的东西,很多函数直接从INT 21h和INT 10h里拿能力。现代操作系统不让你随便访问端口、改中断向量,也不认 16 位 EXE 的加载方式。拿一篇文章的量来说,与其在虚拟机里装一整套 DOS,不如直接用 DOSBox,它有现成的周期模拟,又方便挂载目录。

我拿到这种课设压缩包,第一件事不是打开代码,而是找两样东西:dosbox.conf或类似的启动配置,以及build.bat之类的编译脚本。很多打包资料里会带这两样,没有就自己搭。下面这个配置是我最常用的一套,直接放到 DOSBox 的配置文件末尾,相当于启动后自动挂载工作目录:

[autoexec] mount C D:\asm_workspace set PATH=C:\MASM611\BIN;%PATH% C: cd \project4

这个配置里,mount C D:\asm_workspace是把 Windows 下的工作目录映射成 DOS 的 C 盘,set PATH让ml.exe、link.exe直接可用。之后每次启动 DOSBox,就自动进入项目目录。注意,路径里不要带中文和空格,汇编工具链对这类路径的兼容性很差,这是不少新手第一次翻车的地方。

如果资料包里有MASM或TASM的子目录,优先用包内自带的版本,避免不同版本对指令集和伪指令的宽容度差异。MASM 6.11 对简化段定义.model small支持稳定,TASM 在IDEAL模式下语法略不同。我不会在这两者之间反复横跳,选一个就用到底,免得代码里ASSUME和段名对不上。

2.2 一条命令走完编译链接,但你要知道每一步发生了什么

很多课设资料只给.asm源文件,没给脚本。我一般会在项目目录下放一个build.bat,内容长这样:

@echo off C:\MASM611\BIN\ml.exe /c /Zi bigmul.asm C:\MASM611\BIN\link.exe /CO bigmul.obj,bigmul.exe,,,

这里ml.exe /c表示只编译不链接,生成目标文件.obj;/Zi生成调试信息,方便后用DEBUG或专用调试器单步跟踪。link.exe后面那串参数,依次是目标文件、输出可执行文件名、映射文件名、库文件路径,逗号间留空就表示使用默认值。最后bigmul.exe就能在 DOSBox 里直接运行。

这段脚本看起来简单,但有一个细节容易踩坑:链接时如果用了/CO生成 CodeView 调试信息,文件体积会变大,而且部分 DOS 环境会拒绝运行带调试段的程序。我的经验是,调试阶段保留/CO,最后交作业时把/CO去掉重新链接一次,让生成的 EXE 更干净。

还有一个常见做法是把多个源文件一起编进一个工程。比如贪吃蛇程序里既有蛇身逻辑,又有界面刷新,有些同学会拆成snake.asm、screen.asm、key.asm三个文件。这种情况下用一条ml /c逐个编完,最后再统一链接:

ml.exe /c /Zi snake.asm ml.exe /c /Zi screen.asm ml.exe /c /Zi key.asm link.exe /CO snake.obj+screen.obj+key.obj,snake.exe,,,

链接器对目标文件的顺序有要求:程序入口所在的文件要放在最前面,否则入口地址可能找不到。这也是很多人把文件一改名就链接失败的根源。

2.3 段定义是这门课的隐形得分点

打开四个源码文件,你会发现它们结构高度一致:DATA SEGMENT、CODE SEGMENT、END START。这是 8086 汇编最基础也最重要的框架。直接写内存地址的时代已经不需要你记物理地址,但段寄存器的初始化一个都不能少。

DATA SEGMENT PARA PUBLIC 'DATA' buf db 256 dup(?) fname db 'a.txt', 0 DATA ENDS CODE SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CODE, DS:DATA, SS:STACK START: mov ax, DATA mov ds, ax mov ax, STACK mov ss, ax mov sp, 200h ; 主逻辑 mov ah, 4ch int 21h CODE ENDS END START

ASSUME只是告诉编译器“代码段和数据段的段名分别是什么”,真正把段地址装进寄存器的是mov ax, DATA / mov ds, ax这两条。漏掉后面这两条,运行时ds还指向程序加载时的默认段,数据区的变量全都取错位置。这种错误编译期不报,运行期乱出结果,属于典型的“复制粘贴容易翻车”点。

我把四个程序的段定义放在一起对比过,最大的差别在数据区大小。贪吃蛇要维护蛇身坐标数组、食物坐标、方向标志、成绩显示缓存,数据段最大;大数相乘和计算器则是缓冲区多、变量少。写这类程序时,我习惯把数据区里的缓冲区按 16 字节对齐,并用dup(?)预留足够空间。SP的值也不用给得太大,DOS 下默认堆栈足够跑这些课设,问题是很多新手把STACK SEGMENT忘了,程序一执行调用子程序就崩。

3. 大数相乘与计算器:从寄存器溢出到表达式处理

3.1 大数相乘:MUL 只是第一步,进位链才是核心

大数相乘这个题放在汇编课上,本质是让你实现一个不受寄存器位宽限制的整数乘法。8086 的MUL指令做 16 位乘 16 位,结果放到DX:AX,已经能表示 32 位结果。可课设里要算的往往是几十位十进制数相乘,一个MUL根本放不下。

处理思路和手算竖式一样:把大数按位拆开,一位一位乘,再把结果累加到对应位置。传统做法是把十进制数当字符串存,每个字节存放一个 0 到 9 的数字,乘完后再做进位整理。下面这段是资料里大数相乘程序的核心片段,我做过注释整理:

; 一次十进制乘法的核心:res[i+j] += a[i] * b[j] ; 输入:si -> a[] 的某一位,di -> b[] 的某一位 ; bx -> res[] 当前位,carry 保存进位 mov al, [si] ; 取 a[i],范围 0-9 mul byte ptr [di] ; ax = a[i] * b[j],最大 81 mov cl, [carry] ; 把上次进位加进来 add al, cl add al, [bx] ; 加上这一位原来的累计值 xor ah, ah mov cx, 10 div cx ; al = 商,ah = 余数 mov [bx], ah ; 余数留在本位 mov [carry], al ; 商作为新的进位

逐行看,mul byte ptr [di]是两个十进制单数字相乘,结果最大不超过 81。把它加上从下一位传上来的进位,再加上结果缓冲区里原有值,最大也不会超过 99,除以 10 后余数就是当前位,商是传给下一位的进位。外层两层循环控制a[i]和b[j]的遍历,这里不展开,但理解了内层这段,整段代码的骨架就清楚了。

这里有两个容易被忽略的参数。一是div cx之前必须xor ah, ah,因为div在 16 位模式下默认用DX:AX作为被除数,不清高 16 位部分,结果会被残留数据污染。二是在内层循环结束后,进位不一定为 0,需要单独写到结果数组更高位。比如 999 乘 999,最后一位乘完还会有进位,不处理就丢了一位。

常见做法是程序里先把乘数和被乘数都逆序存放,低位在低地址,循环时统一从低到高遍历。这样最后输出时再逆序打印一次。资料里的代码也是这么处理的,你如果直接拿正序字符串去套这段逻辑,会落后一位,运行结果全错。

3.2 计算器:字符串转数值和打印,比四则运算本身更考验人

计算器题在汇编课设里不算难,但覆盖面很广。它至少要处理三件事:把用户输入的数字字符串转成整数,按运算符执行计算,再把整数结果转回字符串输出。一个大数计算器的变体还可能涉及乘除溢出,但基础版的难点基本集中在输入输出转换上。

先看十进制字符串转整数。教科书上写mul 10,可很多初学者没意识到 8086 的 16 位乘法会污染DX,所以我会用移位加来实现乘 10:

; 输入:si 指向以 '$' 结尾的十进制字符串 ; 输出:dx = 数值,si 指向结束符 atoi: xor dx, dx atoi_next: lodsb cmp al, '$' je atoi_end cmp al, '0' jb atoi_end cmp al, '9' ja atoi_end sub al, '0' mov cx, dx shl dx, 1 mov bx, dx shl dx, 1 shl dx, 1 add dx, bx add dx, cx jmp atoi_next atoi_end: ret

先保存原dx到cx,然后shl dx, 1得到原数乘 2,再把dx存进bx,接着左移两次得到原数乘 8,最后add dx, bx就是乘 10,再加上刚读到的数字位。这一段如果直接写mov cx, 10 / mul cx,一旦dx没提前清零,结果会差得离谱,这也是我不用mul的原因。

输出反过来更难。要把一个 16 位整数逐位拆成十进制字符,得用div反复除以 10。每除一次得到的余数是当前最低位,需要压入栈,等全部除完再从栈里弹出,恢复高位顺序。资料里一般会给itoa例程,但没有栈操作经验的人很容易把顺序搞反。我调这种代码时,最喜欢用DEBUG的T命令单步看栈顶变化,比空想快得多。

表达式处理部分,课设版计算器通常不做括号,也不做乘除优先级,而是从左到右依次计算。这是简化后的约定,不是缺陷。你拿到代码后如果想去扩展,优先加“乘除优先”逻辑,而不是把整个解析重写。常见做法是第一次扫描先处理*和/,第二次扫描再处理+和-,这样改动量最小。

; 运算符分发示意,实际代码里用 AL 保存当前运算符 cmp al, '+' je do_add cmp al, '-' je do_sub cmp al, '*' je do_mul cmp al, '/' je do_div jmp invalid_op do_add: add dx, bx jmp calc_done do_sub: sub dx, bx jmp calc_done do_mul: mov ax, dx imul bx jmp calc_done

imul bx默认把AX乘BX,结果放进DX:AX。当数值超过 16 位时,DX不再为 0,后续打印还要考虑扩展位。这也是为什么很多课设版计算器只支持 0 到 65535 的输入,超过就报错,不是偷懒,而是 16 位寄存器的客观边界。

4. 文本比较与贪吃蛇:文件句柄、CMPSB 和 BIOS 中断

4.1 文本比较:用文件句柄读两个文件,然后用一条字符串指令找不同

文本比较程序从名字看很简单,但真正写起来要过两道坎:一是文件读取是否正确拿到了文件内容,二是比较边界是否处理干净。DOS 下读取文件的接口是INT 21h的AH=3Dh和AH=3Fh。

; 打开第一个文件,只读模式 mov ax, 3d00h ; AH=3Dh 打开文件,AL=0 只读 mov dx, offset fname_a ; DS:DX 指向文件名 int 21h jc open_error ; CF=1 表示打开失败 mov bx, ax ; BX = 文件句柄 ; 读取文件内容到缓冲区 mov ah, 3fh mov cx, 512 ; 每次最多读 512 字节 mov dx, offset buf_a int 21h mov [len_a], ax ; AX = 实际读到的字节数

jc open_error是容易忽略的错误处理。文件不存在、路径不对或中文文件名在 DOSBox 下编码异常,都会让CF置 1。没有这行判断,后面mov bx, ax会拿到一个垃圾句柄,后续读取直接报错。

两个文件都读进缓冲区后,比较的核心可以用REPE CMPSB。这条指令会同时比较两个内存区域的内容,并把比较次数用在CX里,直到发现不同或比较完所有字节。

cld ; 方向标志清 0,地址递增 mov si, offset buf_a mov di, offset buf_b mov cx, [len_a] ; 假设两个文件长度一致 repe cmpsb ; 逐字节比较,CF/ZF 反映结果 jz file_same dec si ; 不相等时 SI 指向差异位置的下一个字节

dec si这行是很多人的盲区。CMPSB执行后,SI和DI已经指向下一字节,如果不回退一位,输出的差异位置会比实际靠后 1。这个偏移只在两个文件长度相同的情况下才可靠;长度不同时,程序要先判断字节数,否则短文件后面全是垃圾数据,比较结果没有意义。我一般会在比较前先做长度判断,长度不同直接报告“文件长度不同”,不再逐字节比。

4.2 贪吃蛇:时钟中断取速度,BIOS 调用刷新画面

贪吃蛇是四个程序里最“偏硬件”的一个。它要用INT 16h读键盘、用INT 10h写字符、用INT 1Ah取时钟计数来控制移动速度。整个过程没有操作系统帮你做事件循环,全靠中断和轮询。

方向键按键读取是常见翻车点。普通字母键可以直接读AL里的 ASCII 码,但方向键没有 ASCII 码,它的扫描码在AH里。读键的标准姿势是先用AH=01h查询,再用AH=00h读取:

wait_key: mov ah, 01h int 16h ; 查询键盘缓冲区,ZF=1 表示无按键 jz no_key mov ah, 00h int 16h ; 读取按键,AH=扫描码,AL=ASCII 码 cmp ah, 48h je key_up cmp ah, 50h je key_down cmp ah, 4bh je key_left cmp ah, 4dh je key_right

48h、50h、4bh、4dh分别是上、下、左、右四个方向键的扫描码。如果你拿AL去判断方向键,得到的多半是0,因为方向键没进AL。这是最容易被经验主义带偏的地方,别问为什么我以前会犯,问就是重新看了一遍中断参考表。

画面的刷新我建议先用INT 10h的02h设置光标位置,再用09h写字符。这个组合看起来啰嗦,但比直接往B800:0000写显存安全得多:

; 在指定位置画蛇身方块 mov ah, 02h mov bh, 0 mov dh, row ; 0-24 行 mov dl, col ; 0-79 列 int 10h ; 光标定位 mov ah, 09h mov al, '*' ; 蛇身字符 mov cx, 1 mov bl, 0eh ; 黄字黑底 int 10h ; 在当前光标位置写字符

直接写显存的优点是快,但你需要自己维护段地址和偏移,一旦蛇身坐标越过 80x25 的边界,很容易把数据写到别的段里。用INT 10h慢一点,不过课设的蛇不需要满屏重绘,速度足够。

蛇的速度控制,资料里最常见的是靠INT 1Ah读时钟计数。DOS 的时钟大约每秒钟跳动 18.2 次,你可以记录上一次 tick,等 tick 变化超过设定值后再移动一格。这个方法比空转延时靠谱,因为它跟 CPU 频率无关,在 DOSBox 和真机上表现比较一致。

4.3 两个程序的共同点:状态机思维让代码结构清晰

文本比较和贪吃蛇一个偏文件、一个偏界面,但内部结构都适合用状态机来理解。文本比较的状态是“当前位置相同”和“当前位置不同”,贪吃蛇的状态是“移动方向”和“蛇身位置”。我在读这份资料时发现,运行最稳定的贪吃蛇版本,蛇身坐标存的是一个固定大小的数组,每移动一格就把所有坐标往前挪一位,新蛇头置为最新位置。

这种“整块挪数组”的做法在数据量小时非常直观,但要注意数组越界。蛇身最长理论上可以填满整个屏幕,数组长度至少按 80 乘 25 预留。很多程序只开 200 字节,蛇吃到一定长度后直接死机,那多半不是逻辑错误,是坐标数组越界覆盖了数据段的其它变量。

文件比较程序的状态机则体现在“是否已经发现差异”。比较到第一个不同字节后,程序不必继续往下读,直接输出行号和内容即可。这样做既节省时间,也避免文件末尾的换行符差异干扰判断。我后来改版时加了一个小功能:比较到差异后继续读完两个文件,统计总共有几处不同。这样程序不只有“相同/不同”两个结果,而是能给出一个统计值,交作业时更能讲清楚。

5. 避坑指南:四份汇编代码最常见的六个翻车现场

5.1 编译链接阶段的问题

先说编译期。很多人用记事本编辑.asm文件,保存时默认是 UTF-8 编码,MASM 对 UTF-8 的兼容性很差,第一行注释如果带中文,ml.exe可能直接报A2008 syntax error,错误位置指向文件尾部。解决办法是另存为 ANSI 编码,或者源码里全部用英文注释,再配合批处理脚本编译。

另一个高频问题是路径。DOSBox 挂载时mount C D:\asm_workspace,这个 Windows 路径里如果含中文,挂载后能看到目录但无法正常读取部分文件。一律改成纯英文路径,能消掉至少一半怪问题。

还有一个现象是程序编译没问题,链接时报LNK1136或直接说cannot open file。原因通常是链接参数里库文件名写错,或者链接器版本与编译器不一致。MASM 6.11 配套的链接器应该用同一个安装目录下的link.exe,不要拿别的版本替换,不同版本的COFF和OMF目标文件格式可能不兼容。

5.2 运行逻辑阶段的问题

运行期最典型的翻车是“大数相乘结果少一位”。现象是最后一位总是丢,程序算 99 乘 99 结果是 980,不是 9801。原因就是内层循环结束后,最后一次进位没有被写回结果缓冲区。解决方法是整个循环跑完后,单独检查进位寄存器,不为 0 就继续往高位写。

计算器输入大数也有一个问题:输入65535 + 1,结果显示负数或乱码。这是 16 位溢出,AX存不下 65536。课设版程序一般不会检测溢出,所以你需要自己决定边界。如果想支持更大输入,就把所有运算提升到 32 位,用DX:AX组合,但这样打印整数也要跟着改,工作量会明显增加。

文本比较最常见的误报是“完全相同的文件被判定不同”。我排查过一次,最后发现是文件读取缓冲区的剩余垃圾导致。每次读取后,缓冲区里超过实际读取长度的字节还保留着上一次的数据,程序如果拿固定512字节去比较,哪怕两个文件内容一样,缓冲区尾部不同也会误报。解决方法是始终用mov [len], ax记录实际读取字节数,比较长度只取这个值。

贪吃蛇的速度在 DOSBox 里也经常不正常。现象是蛇跑得飞快或几乎不动。原因是cycles设置太高时,代码执行速度远快于真实硬件,而你用INT 16h查询按键和INT 10h写字符的耗时也会被压缩。解决方法是把蛇的移动间隔用 tick 数控制,比如每次INT 1Ah时钟计数增加 3 再移动一格,而不是空转延时。空转延时在 DOSBox 里和真机上表现差异极大,属于典型的翻车写法。

还有一个容易踩的:方向键反了。现象是按下 “上” 蛇往下走。原因很可能是键盘扫描码比较被写反,或者INT 16h在读取时被前一次按键的扫描码覆盖。我在调试时习惯在按键读取后面加一个mov [last_key], ah,每读一次就记录一次,单步运行时可以立刻知道当前读到的是哪个扫描码,比反复猜快得多。

6. 验证与进阶:用 DEBUG 单步和边界用例把代码变成自己的

拿到资料里的代码,能跑通只是第一步。我会花一小时做三件事:边界测试、单步跟踪、小改造。

第一件事,用几个典型用例验证大数相乘。我一般手写三组:0 乘任意大数,99 乘 99,以及一组几十位的数乘一位数。0 乘大数最容易看出进位链有没有问题,因为任何一位的进位残留都会导致结果出现非 0。99 乘 99 适合验证两位数的进位,能算出 9801 基本就说明内层循环没大问题。更长的用例我会用 Python 先生成结果,再拿汇编程序输出做对照,这一步能在十分钟内找出进位丢失或逆序错误。

计算器的验证我更关注输入边界。0 到 9 的单个数字、带前导零的007、65535 + 1的溢出情况,这三组能覆盖绝大多数转换和溢出问题。前导零特别容易踩坑,因为atoi循环没有限制数字位数,遇到007时会正常输出 7,但如果数据区缓冲区越界,007后面跟着的内存垃圾可能被当成数字读进去。DEBUG 下用D ds:si查看缓冲区内容,比任何打印语句都快。

第二件事,是找到代码里的关键断点,用 DEBUG 单步走一遍。我不主张整段程序从头走到尾,那样太慢。我只关心三处:大数相乘的进位处理、文本比较的CMPSB执行前后、贪吃蛇的方向键扫描码。每一处看寄存器变化,比看结果再猜原因有效得多。

第三件事,是做一个“最小改造”。文本比较程序里,把原来输出差异字节位置,改成输出所在行号;贪吃蛇程序里,把蛇的移动间隔从 tick 数改成可配置变量。这两个改动都不大,但能逼你真正理解别人的代码结构。

从那以后,我每次拿到新的汇编程序,第一件事不再是打开主逻辑从头读,而是先看段定义、缓冲区长度、进位标志会不会被漏掉,然后强制把所有子程序入口都在 DEBUG 里过一遍。这种习惯救过我很多次,尤其是那些注释写着“可运行”却一改就崩的课设代码。希望这篇拆解,能让你少走几步弯路。

本文还有配套的精品资源,点击获取

相关新闻

哈希表专题二:四数相加、赎金信与三/四数之和去重实战

哈希表专题二:四数相加、赎金信与三/四数之和去重实战

day07,训练营的哈希表专题进入第二天。上一轮专题一的题目——有效的字母异位词、两个数组的交集、快乐数、两数之和——基本把“哈希表能用来干什么”这件事讲透了:判断元素是否出现过、统计字符频次、快速配对查找。到专题二,题单直接换了口…

2026/10/20 9:49:24 阅读更多 →
NC6/NC65超级管理员root被锁定?数据库重置密码与解锁全流程

NC6/NC65超级管理员root被锁定?数据库重置密码与解锁全流程

简介:面向用友NC6/NC65系统运维与实施人员,这份下载资源专门解决超级管理员root密码遗忘或账号被锁定的常见故障,尤其适合企业生产环境下需要快速恢复登录的场景。当root无法登录时,将资源中的XML配置模板替换至NC65安装目录下的指…

2026/10/20 9:49:24 阅读更多 →
AI辅助开题报告写作:从选题到初稿的高效工作流解析

AI辅助开题报告写作:从选题到初稿的高效工作流解析

你是不是也遇到过这种场景:憋了整整一个礼拜,好不容易把开题报告的初稿发给导师,结果第二天收到回复——研究背景太空、国内外现状像流水账、技术路线画得毫无逻辑、核心概念定义不清。整个文档被打回,你盯着满屏的批注&#xff0…

2026/10/20 9:49:24 阅读更多 →

最新新闻

文件夹.EXE病毒专杀工具:Windows资源管理器劫持急救方案

文件夹.EXE病毒专杀工具:Windows资源管理器劫持急救方案

简介:这是一款专为清除“文件夹.EXE”类伪装型病毒设计的轻量级杀毒工具,面向普通电脑用户及初级系统维护人员,解决因误点伪装文件夹导致的恶意代码执行、文件隐藏、系统异常等典型感染问题。压缩包共4个文件(443KB)&a…

2026/10/20 10:23:05 阅读更多 →
300W人脸关键点数据集整理包:开箱即用的COCO-Keypoints工程资产

300W人脸关键点数据集整理包:开箱即用的COCO-Keypoints工程资产

简介:本资源是面向计算机视觉研究者与深度学习工程师的300W人脸关键点数据集整理包,专为面部对齐、关键点检测及人脸几何建模等任务提供高质量训练基础。资源包含2个核心NumPy数据文件(facial_image.npy与facial_keypoints.npy)&a…

2026/10/20 10:23:05 阅读更多 →
微博热搜爬虫实战:requests直取JSON+Excel结构化落盘

微博热搜爬虫实战:requests直取JSON+Excel结构化落盘

简介:本资源是一份面向Python初学者与数据采集实践者的轻量级微博热搜爬虫实战项目,聚焦社交媒体热门话题的自动化抓取与结构化存储。项目使用requestsBeautifulSoup实现网页请求与HTML解析,提取微博TOP50热搜标题及链接,并通过pa…

2026/10/20 10:23:05 阅读更多 →
高并发发卡系统设计:券码生成、库存扣减与核销闭环

高并发发卡系统设计:券码生成、库存扣减与核销闭环

简介:这是一套面向电商运营者与PHP开发者的一站式发卡平台源码,聚焦团购营销与虚拟商品二级交易场景,解决传统发卡系统缺乏用户自流转、活动运营弱、资金监管缺位等痛点。资源共2000个文件,主体为507个PHP后端逻辑文件、304个HTML…

2026/10/20 10:23:05 阅读更多 →
WinForm自绘登录窗体实战:无边框圆角UI与自绘控件实现解析

WinForm自绘登录窗体实战:无边框圆角UI与自绘控件实现解析

简介:C#登录窗体完整示例包,面向WinForms桌面应用初学者及中级开发者,可用于课程设计、项目原型或界面参考,集中演示了如何构建外观出众且具备完整交互逻辑的登录模块。压缩包为RAR格式,共70个文件,大小约5…

2026/10/20 10:23:05 阅读更多 →
ROS2+Autoware实车部署:跨越仿真与物理世界的三堵墙

ROS2+Autoware实车部署:跨越仿真与物理世界的三堵墙

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:22:04 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →