汇编子程序与数制转换:深入8086栈机制与寄存器契约
1. 这不是一份“交差式”实验报告而是一次对底层逻辑的重新校准你手头这份《子程序应用数制转换程序设计》实验表面看是汇编语言课的一次常规上机任务但实际踩进去就会发现它根本不是在考你怎么写一个能跑起来的程序而是在逼你亲手拆开计算机最基础的运算齿轮看清“10进制数字”和“二进制机器码”之间那层薄如蝉翼、却重若千钧的翻译膜。我带过几届学生做这个实验八成人在第一次提交时卡在“为什么明明逻辑没错输出却全是乱码或零”剩下两成人能跑通但完全说不清栈指针SP在调用CONV_DEC_TO_HEX子程序前后跳了几次、每次跳多少字节——这恰恰暴露了问题核心我们习惯性地把“子程序”当成黑盒函数去调用却忘了在汇编里每一次CALL指令都是一次对CPU寄存器、堆栈、内存布局的精确手术。这个实验真正的价值不在于最终输出“1234H”这个结果而在于你能否在调试窗口里盯着CS:IP一步步走到子程序入口看着AX里的值被压入栈、BX被赋新值、再从栈里弹出旧AX——那一刻你才真正“看见”了程序是如何被组织、被调度、被控制的。它适合两类人一类是刚学完寄存器和寻址方式、正处在“知道语法但不懂运行”的临界点的学习者另一类是已经会用高级语言写算法、却想回溯到底层搞清“printf(“%x”, n)”背后究竟发生了什么的进阶者。如果你只是想抄一份能通过老师检查的代码那这篇内容对你帮助有限但如果你愿意花两小时在DEBUG里单步执行十遍你会发现自己对整个计算机体系的理解会突然下沉一个扎实的层级。2. 实验设计背后的三重逻辑为什么必须用子程序为什么必须做数制转换为什么非得是汇编2.1 子程序不是代码复用技巧而是对“控制流主权”的一次移交与回收在高级语言里写一个int toHex(int n)函数你只关心输入输出和内部逻辑。但在8086汇编里定义一个子程序远不止加个PROC和ENDP标签那么简单。它本质是一次对CPU控制权的精密交接协议。当你执行CALL CONV_DEC_TO_HEX时CPU自动完成三件事将下一条指令的偏移地址即返回地址压入栈将CS段寄存器值压入栈跳转到子程序入口地址。这看似简单的三步背后藏着对系统稳定性的绝对要求——如果栈空间不足、SP指针错位、或者子程序末尾忘记RET整个程序就不是“结果错误”而是直接“崩溃重启”。我见过太多学生在子程序里随意修改SI、DI寄存器后不恢复导致主程序后续字符串处理全乱套查了三小时才发现是子程序“借”了寄存器没还。所以这个实验强制用子程序根本目的不是为了“模块化”而是逼你直面一个事实在汇编层面没有“局部变量”的概念只有“寄存器所有权”和“栈空间契约”。你写的每一行PUSH/POP都是在签署一份关于资源使用的法律文件。2.2 数制转换最朴素的计算过程最锋利的思维解剖刀为什么选“十进制转十六进制”而不是“排序”或“查找”因为数制转换是少数几个纯计算、无IO依赖、步骤清晰可逆、且每一步都能映射到具体寄存器操作的经典问题。以十进制数1234为例手工转换要反复做“除16取余”1234 ÷ 16 77 余 277 ÷ 16 4 余 13D4 ÷ 16 0 余 4结果是4D2H。这个过程在汇编里被拆解为用AX存当前被除数初始1234用BX存除数16DIV BX指令执行后商存AX余数存DX将DX中的余数0-15转换为ASCII字符0-9→0-910-15→A-F将字符存入内存缓冲区循环直到AX0你看这里没有魔法每一个数学动作都对应一个确定的寄存器状态变化。它不像图形渲染有显存抽象也不像网络编程有协议栈封装。它就是赤裸裸的“数据搬移算术运算条件跳转”。当你在DEBUG里看到DX从2变成13再变成4你就亲眼见证了“数值”如何一步步蜕变为“可显示的符号”。这种确定性是训练底层思维不可替代的沙盒。2.3 汇编语言唯一能让你“听见”晶体管开关声的语言很多人问“现在都用Python写AI了学汇编还有意义”这个问题的答案就藏在这个实验的调试过程中。当你用T命令单步执行DIV BX时CPU需要多个时钟周期完成除法运算期间AX、DX、FLAGS寄存器的状态会经历一系列中间态当你用D DS:100查看内存缓冲区看到44 44 32 00即D,D,2,0时你看到的不是字符串而是内存地址上连续四个字节的电平高低组合。汇编是唯一一种让你能将“一行代码”与“物理硬件行为”建立1:1映射的语言。高级语言的printf隐藏了字符编码、缓冲区管理、系统调用等十几层抽象而这个实验里你亲手把DX13变成ALD即AL ← AL 55H再把AL存入[BUFFER1]整个链条短到你可以用手指在纸上画出每个字节的流向。这不是怀旧而是构建技术直觉的基石——就像建筑师必须懂混凝土配比程序员也必须懂数据在硅片上如何呼吸。3. 核心实现细节与实操要点从寄存器分配到栈平衡的全程拆解3.1 寄存器分工不是随便选而是按“生存期”和“破坏性”严格划分很多初学者一上来就用AX存输入数、BX存除数、CX存循环计数结果在子程序里AX被DIV改写后主程序接着用AX做别的事就全错了。正确的寄存器策略必须遵循8086的调用约定虽然没有强制标准但有行业共识寄存器主程序责任子程序责任理由AX, DX传入参数被转换数修改后返回结果余数/商DIV指令天然使用AX/DX避免额外MOVBX, SI, DI保存关键地址如BUFFER首地址必须保护入口PUSH BX出口POP BX这些寄存器在子程序中常被用作指针主程序依赖其值CX可自由使用循环计数若使用必须PUSH/POPCX常用于LOOP但子程序内是否用它不确定保守起见一律保护SP, BP, CS, DS, SS绝对不主动修改仅在必要时临时调整如建栈帧这些是系统级寄存器乱动等于自毁我实测过一个未保护BX的子程序在转换第二个数时因BX残留了上一次的缓冲区偏移导致新字符覆盖了旧字符的高位字节输出变成乱码。解决方法极其简单在子程序开头加PUSH BX结尾加POP BX多两行代码省去三小时调试。3.2 栈空间管理SP的每一次移动都是对内存安全的宣誓子程序调用时CPU自动压入IP和CS占4字节。如果你在子程序里又PUSH AX、PUSH BX、PUSH CX那就是再加6字节。这意味着当子程序执行RET时SP必须精准回到调用前的位置否则RET弹出的就不是原来的IP而是你PUSH进去的某个数据程序直接跳到未知地址。我在某次实验中故意把POP BX写成POP AX结果RET弹出的是BX的旧值当IP程序跳到数据段里执行DEBUG报Illegal instruction。排查方法很简单在CALL前记下SP值比如SP0100H进入子程序后每执行一次PUSHSP减2执行POPSP加2到RET前SP必须回到0100H4因为CALL压了4字节。用DEBUG的R SP命令随时监控比看代码更直观。3.3 十六进制字符转换ASCII码的“偏移艺术”将余数0-15转为字符0-9、A-F是本实验最易错的环节。常见错误写法CMP DX, 10 JB DIGIT_0_9 ADD DX, A - 10 ; 错DX是余数不是AL且 A-1055H但DX可能255 JMP STORE_CHAR DIGIT_0_9: ADD DX, 0 ; 错DX是16位030H加30H后可能溢出正确做法必须先将余数放入AL8位再统一处理MOV AL, DL ; 取DX低8位余数必16所以DL就够 CMP AL, 10 JB IS_DIGIT ADD AL, 7 ; 10→A(41H), 所以1071711H? 不对10717, 但A41H, 030H, 所以10→A需37H(55D) ADD AL, 30H ; 先转成0-9 CMP AL, 9 JBE STORE_CHAR ADD AL, 7 ; 91A, 所以9之后的数7 STORE_CHAR: MOV [SI], AL ; 存入缓冲区 INC SI更优雅的写法是查表法空间换时间HEX_TABLE DB 0123456789ABCDEF ... MOV BX, OFFSET HEX_TABLE MOV AL, DL XLAT ; AL ← [BXAL], 自动查表 MOV [SI], AL INC SIXLAT指令专为此类转换设计一行顶五行且无分支执行时间稳定。3.4 缓冲区设计为什么必须从高地址向低地址存十进制转十六进制余数是“从低位到高位”产生的1234→2, D, 4但最终显示要“从高位到低位”4D2H。所以不能顺序存入缓冲区否则要额外反转。标准解法是分配足够大的缓冲区如10字节让SI指向缓冲区末尾每生成一个字符就DEC SI最后SI1就是结果首地址。例如缓冲区BUFFER DB 10 DUP(0)初始MOV SI, OFFSET BUFFER9第一次存2到[SI]地址9DEC SI到8存D再DEC SI到7存4。最终结果在[SI1]到[SI3]即地址8,7,6。这样避免了反转循环且内存布局清晰。我试过用PUSH把字符全压栈再POP出来理论上可行但栈空间小通常1KB且PUSH是字操作2字节存单字节字符浪费空间不推荐。4. 完整实操流程与关键配置从DEBUG环境搭建到逐行验证4.1 环境准备用最简工具链拒绝IDE幻觉别用任何现代IDE模拟8086它们抽象层太厚会掩盖真实问题。坚持用原生工具链编辑器Notepad开启“显示所有字符”确认无BOM头汇编文件必须是ANSI编码汇编器MASM 5.0ml.exe命令ml /c /Zi filename.asm/Zi生成调试信息链接器LINK命令link filename.obj;生成.exe调试器DEBUG最经典-r看寄存器-d看内存-t单步-u反汇编为什么不用EMU8086因为它默认开启“内存保护”而真实8086没有。你在EMU里能跑通的代码放到DEBUG里可能因栈溢出直接死机。DEBUG的残酷正是它最大的价值。4.2 代码骨架一个可直接运行、带完整注释的模板; 文件名: conv.asm ; 功能将AX中的十进制数转为十六进制字符串存入BUFFER ; 输入AX 待转换数0-65535 ; 输出BUFFER中为ASCII字符串末尾有$DOS显示用 CODES SEGMENT ASSUME CS:CODES, DS:DATAS START PROC FAR PUSH DS XOR AX, AX PUSH AX ; 设置返回DOS的堆栈 MOV AX, DATAS MOV DS, AX ; 主程序设置输入并调用子程序 MOV AX, 1234 ; 要转换的数 CALL CONV_DEC_TO_HEX ; 调用子程序 ; 显示结果 MOV DX, OFFSET BUFFER MOV AH, 09H ; DOS功能显示字符串 INT 21H ; 返回DOS MOV AH, 4CH INT 21H START ENDP ; 子程序十进制转十六进制字符串 ; 入口AX 待转换数 ; 出口BUFFER中存入十六进制字符串不含H末尾$ CONV_DEC_TO_HEX PROC NEAR PUSH AX ; 保护主程序AX PUSH BX ; 保护BX用作指针 PUSH CX ; 保护CX PUSH DX ; 保护DX MOV BX, OFFSET BUFFER 9 ; BX指向缓冲区末尾10字节索引9 MOV BYTE PTR [BX], $ ; 先置结束符 DEC BX ; BX指向倒数第二字节 ; 核心转换循环 CONV_LOOP: XOR DX, DX ; 清DX为DIV准备 MOV CX, 16 ; 除数16 DIV CX ; AX AX/16, DX AX%16 (余数0-15) ; 余数转ASCII MOV AL, DL ; 余数到AL CMP AL, 10 JB DIGIT_0_9 ADD AL, 7 ; 10-15 → A-F DIGIT_0_9: ADD AL, 0 ; 0-9 → 0-9 MOV [BX], AL ; 存入缓冲区 DEC BX ; 指针前移 ; 判断是否结束 CMP AX, 0 ; 商为0 JNE CONV_LOOP ; 否继续 ; 调整BX到结果首地址 INC BX ; BX现在指向第一个字符 ; 将结果地址存回DS:DX供主程序显示 MOV DX, BX POP DX ; 恢复寄存器 POP CX POP BX POP AX RET ; 返回主程序 CONV_DEC_TO_HEX ENDP CODES ENDS DATAS SEGMENT BUFFER DB 10 DUP(0) ; 10字节缓冲区 DATAS ENDS END START4.3 DEBUG调试实录手把手带你走通关键路径假设已生成conv.exe在DOSBox中运行debug conv.exe加载后查看入口-r显示CS134E IP0100-u 134E:0100 134E:0120反汇编前20字节确认CALL指令地址。设置断点-a 134E:010CCALL指令所在行然后-g100 10C运行到断点。观察调用前状态-r看AX1234SP0100假设。单步进入子程序-t执行CALL-r立刻看到SP00FC压入4字节IP已变到子程序入口。跟踪转换循环在CONV_LOOP标号处设断点-a 134E:0120-g100 120。第一次-t后-r看AX771234/16DX2余数-d ds:134E9看[BUFFER9]已存$[BUFFER8]应为232H。验证字符转换-t到ADD AL, 0后-r AL应为32H再到MOV [BX], AL-d ds:134E8 134E8确认该字节是32。检查栈平衡在RET前-r SP应为00FCCALL后SP6三个PUSH-6三个POP00FCRET后SP应回到0100。这个过程重复三遍你就能形成肌肉记忆CALL→SP-4PUSH→SP-2POP→SP2RET→SP4。数字不会骗人。5. 常见问题与排查技巧实录那些让我熬夜到凌晨的坑5.1 问题速查表症状、原因、解决方案症状可能原因排查与解决程序一闪而退无输出INT 21H功能09H要求字符串以$结尾但BUFFER未正确置$或DX未指向首地址用-d ds:offset buffer查看内存确认$在正确位置-r DX确认DX值等于BUFFER首地址输出全是、A等乱码字符转换逻辑错误如ADD AL, 0前AL不是0-9或XLAT表地址错在MOV [BX], AL前-r AL看AL值是否在30H-39H或41H-46H范围内检查HEX_TABLE偏移量只输出一个字符循环条件错如CMP AX, 0写成CMP AX, 1或DIV后AX未更新-t到循环末尾-r AX看商是否真为0确认DIV指令后AX是商不是原值DEBUG报Divide overflowDIV时除数为0或被除数高位过大如AXFFFFH, BX1FFFFH/165535但商需存AX超16位-r BX确认除数非0确保被除数≤65535或用CWD扩展符号位本实验无需输出结果颠倒如2D4而非4D2缓冲区指针未从高地址向低地址写或INC BX后未DEC BX-d ds:offset buffer看字符存储顺序确认MOV BX, offset buffer9和DEC BX在循环内5.2 独家避坑技巧老手才懂的“潜规则”提示DIV指令是“隐式操作数”它永远用AX16位或DX:AX32位作为被除数。新手常写DIV 16这是非法的——8086不支持立即数作除数必须MOV BX, 16再DIV BX。MASM会报错Operand must have size但有些汇编器静默忽略导致运行时异常。注意OFFSET操作符获取的是“段内偏移”不是物理地址。MOV DX, OFFSET BUFFER是正确的但MOV DX, BUFFER无OFFSET会把BUFFER首字节的值0送DX导致INT 21H显示乱码。这是语法陷阱不是逻辑错误。实操心得在子程序里永远先PUSH所有可能被修改的寄存器再POP恢复哪怕你“觉得”没改。我曾为省两行代码不PUSH CX结果子程序里LOOP改了CX主程序后续用CX计数就全错。两行代码换三小时调试不值。实操心得用-d命令查看内存时-d ds:100显示的是DS*16100处的物理地址。如果DS134E则看的是134E0100135E0。确保DS已正确初始化MOV AX, DATAS; MOV DS, AX否则-d看到的不是你的BUFFER。5.3 性能与扩展思考这个实验还能挖多深这个基础实验只是起点。如果你已跑通可以尝试这些延伸支持负数检查AX最高位TEST AX, 8000H若为1则先NEG AX转正转换后在结果前加-。支持任意进制2-16将除数16改为BX传入子程序内动态DIV BX并扩展查表HEX_TABLE需支持0-15但2进制只需0-1。优化为递归用栈存余数CALL自身RET后从栈弹出字符——这会彻底颠覆你对“递归”的理解因为没有函数调用栈只有你自己管理的内存栈。移植到实模式保护模式把代码改写为32位用EAX、EDX体会寄存器宽度扩展带来的变化。这些不是作业要求而是你给自己出的考卷。当你能不假思索地写出PUSHF/POPF来保护标志位或用LEA SI, BUFFER替代MOV SI, OFFSET BUFFER时你就已经超越了实验本身。6. 最后一点个人体会为什么我坚持让学生手写这个实验去年带一个项目团队用C写嵌入式固件遇到一个诡异Bug设备在特定温度下偶发重启。Log显示是malloc失败但内存明明充足。最后用逻辑分析仪抓总线信号发现是某个中断服务程序ISR里调用了未声明为reentrant的函数该函数内部修改了全局变量而主程序正在同一变量上操作——根源就是对“函数调用时寄存器和栈的归属权”缺乏敬畏。那个ISR本质上就是一个没有PUSH/POP保护的汇编子程序。所以当我看到学生为CONV_DEC_TO_HEX纠结于PUSH BX还是PUSH AX时我知道他正在训练的不是汇编技能而是一种工程直觉任何代码都不是孤岛每一次函数调用都是对系统资源的一次郑重签约。这个实验的价值不在它产出的那串“4D2H”而在于你盯着DEBUG窗口里SP数值跳动时心里涌起的那个念头“原来控制权的交接真的可以这么精确。” 这种确定感是任何高级语言都无法给予的礼物。

相关新闻

Android温湿度监控APP开发实战:串口蓝牙数据采集与Room存储告警

Android温湿度监控APP开发实战:串口蓝牙数据采集与Room存储告警

简介:这份资源是面向物联网与移动应用开发学习者的温湿度监控手机APP完整代码包,适合具备一定Android基础、希望打通传感器采集到手机端展示全链路的开发者参考。内容围绕DHT11/DHT22等传感器数据采集、微控制器处理、无线模块上传云端,以及A…

2026/10/16 4:29:20 阅读更多 →
融合物理先验与域自适应的恶劣天气目标检测方法

融合物理先验与域自适应的恶劣天气目标检测方法

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

2026/10/16 4:29:20 阅读更多 →
ONVIF设备支持H265完整开发指南:能力上报、RTSP与RTP打包改造

ONVIF设备支持H265完整开发指南:能力上报、RTSP与RTP打包改造

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

2026/10/16 4:29:20 阅读更多 →

最新新闻

Coder 平台深度解析:环境即代码与云端开发环境搭建指南

Coder 平台深度解析:环境即代码与云端开发环境搭建指南

1. 从“coder”这个标题说起:它到底指什么“coder”这个词,放在今天的技术语境里,含义比五年前宽泛了太多。早些年,它基本就是“写代码的人”的代称,跟 programmer、developer 混着用。但现在你搜“coder”&#xff0c…

2026/10/16 5:08:31 阅读更多 →
带权区间调度问题详解:从贪心失效到动态规划最优解

带权区间调度问题详解:从贪心失效到动态规划最优解

1. 先说这道题的含金量算法设计与分析课程里,习题6.3这种编号,往往卡在一个很微妙的位置——前几章刚讲完分治和贪心,后面紧接着就是动态规划,而6.3恰好就是让你把前两种思维揉碎了再重新拼起来的转折点。我当年做这道题的时候&am…

2026/10/16 5:08:31 阅读更多 →
SVM与神经网络工程选型决策指南:小样本、低延迟、高可解释场景实战

SVM与神经网络工程选型决策指南:小样本、低延迟、高可解释场景实战

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

2026/10/16 5:08:31 阅读更多 →
基于MP2642GR-Z与dsPIC30F4013的2S电池均衡设计与实现

基于MP2642GR-Z与dsPIC30F4013的2S电池均衡设计与实现

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

2026/10/16 5:08:31 阅读更多 →
2020团体程序设计天梯赛复盘:从模拟到压轴的易错点全解析

2020团体程序设计天梯赛复盘:从模拟到压轴的易错点全解析

2020年那届团体程序设计天梯赛,我是真没想到自己最后会坐在电脑前,以线上方式打完全程。更没想到的是,比赛结束后对照榜单复盘,我发现自己丢的分里,有将近三分之一不是"不会做",而是"会做但…

2026/10/16 5:08:31 阅读更多 →
C++十进制转十六进制:从手写算法到标准库全解析

C++十进制转十六进制:从手写算法到标准库全解析

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

2026/10/16 5:07:31 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →