汇编实验5多段程序调试指南:段寄存器与栈的实战解析
汇编语言的实验5——编写、调试具有多个段的程序几乎是每个初学者第一次真正和“段”正面交锋。前几个实验里代码、数据、栈全挤在一个代码段里写起来很随意到了实验5程序必须把数据段、栈段、代码段分开定义段寄存器的赋值、栈顶指针的初始化、内存偏移的计算全都要自己管。这篇博文把我做实验5时从编译、调试到踩坑的完整过程整理出来给正在啃这本经典的汇编教材、卡在多个段上的朋友一个可复现的参考。不管是计算机专业的学生还是准备补汇编基础的爱好者这个实验都是一道绕不过去的坎。1. 实验5的核心目标与为什么难1.1 从单段到多段难在哪8086处理器的内存模型和现在X86保护模式不太一样它靠“段地址:偏移地址”来定位物理地址。一个段在16位实模式下最多64KB程序完全可以把所有东西都塞进一个64KB的段里前面放代码中间放数据后面留一块当栈。前面几个实验基本就是这个套路代码段里摆数据、预留栈空间写起来省事但问题也很明显数据和栈挤在一起稍不注意就互相覆盖程序一复杂偏移量算到头晕。实验5把这个痛点直接摆上台面。程序开始用独立的段来装代码、装数据、装栈这既是8086分段模型的常规用法也是后来学习模块化程序的基础。难的地方不是指令本身而是思维要切换代码默认通过CS:IP取指数据默认通过DS寻址栈操作固定通过SS:SP三套寄存器各管一摊必须在程序的入口处自己把它们初始化对。很多人卡在这个实验不是因为不会写push、pop而是不知道assume和实际段寄存器赋值之间的区别也不知道程序加载后Debug里那些寄存器为什么和自己想的不一样。这些问题恰恰是实验5真正想让你搞清楚的。1.2 实验5让你真正掌握的四个能力这个实验做到位其实是在练四件事。第一掌握多段的定义语法。段名 segment和段名 ends成对出现段可以叫data、stack、code也可以叫ABC名字只是符号。数据段用dw、db定义数据栈段也是普通内存只是约定由SS:SP来管理代码段里写指令。第二掌握assume伪指令的作用。assume ds:data只是告诉汇编器“我接下来打算让DS寄存器指向data段”它本身不生成任何指令。段寄存器不会因为这个声明就自动装好必须用mov ax, data; mov ds, ax这类指令当场赋值。这是新手最容易懵的地方。第三掌握栈段的初始化和使用。栈段定义多大SP初始就该指到栈底加段大小的位置因为栈是向下增长的。push指令先把SP减2再把字数据写到SS:SP指向的内存pop先读数据再把SP加2。理解了方向就不会把SP设成0。第四掌握用Debug观察整个过程。实验5很多思考题不是问“程序结果是什么”而是问“程序加载后DS、SS、SP、CS分别是多少”这必须通过Debug查看光在脑子里推是推不出来的。2. 环境准备与一个可直接运行的多段程序骨架2.1 用masm、link、debug搭一个最小实验环境实验5的代码还是16位实模式程序现在的主流系统不能直接跑需要准备一个DOS环境。我习惯的做法是用一个DOS模拟器或虚拟机里面放好masm.exe、link.exe、debug.exe三个文件把它们和要编写的asm源文件放在同一个目录下这样编译时不用折腾路径对新手最稳。编译流程是很原始的三步。第一步运行masm test.asm汇编器会提示输入目标文件名、源列表、交叉引用直接按回车接受默认值即可生成test.obj。第二步运行link test.obj连接器会提示输入可执行文件名、映射文件、库同样一路回车生成test.exe。第三步运行debug test.exe进入调试界面。如果汇编时报错先看源文件扩展名是不是.asm再看是不是把标点和指令写成了全角字符。我见过太多人在这上面浪费半小时汇编器报错行号指向一个看似无辜的冒号其实是全角冒号。保持所有输入法符号为半角这是最基本的习惯。2.2 典型程序用栈逆序数据段实验5里有一个非常经典的题目定义一个数据段里面放8个字型数据再定义一个栈段用栈把数据段中的8个字逆序存放回来。正好把数据段、栈段、代码段都用到还能观察压栈弹栈的过程。我直接给出一个可完整运行的程序; 实验5典型程序利用栈将数据段中的数据逆序存放 assume cs:code, ds:data, ss:stack data segment ; 定义8个字型数据共16字节 dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment ; 栈段8个字共16字节 dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: ; 1. 数据段地址送DS mov ax, data mov ds, ax ; 2. 栈段地址送SSSP指向栈底末尾 mov ax, stack mov ss, ax mov sp, 16 ; 3. 将数据段8个字依次压栈 mov cx, 8 mov si, 0 push_all: mov ax, ds:[si] push ax add si, 2 loop push_all ; 4. 依次弹出写回数据段开头 ; 出栈顺序与入栈相反数据被逆序 mov cx, 8 mov di, 0 pop_all: pop ds:[di] add di, 2 loop pop_all mov ax, 4c00h int 21h code ends end start这段程序可以直接复制到test.asm里编译运行。注意最后一行是end startstart是代码段里的入口标号它告诉连接器程序该从哪条指令开始执行。2.3 代码逐段拆解段定义、assume和SP的来龙去脉逐段看这个程序能理清很多细节。data segment到data ends定义了一个数据段段内用dw定义了8个字。内存里这16个字节依次是23 01 56 04 89 07 bc 0a ...因为8086是小端存储高字节放高地址。用Debug看内存时看到的是“反着”的字节序别以为是数据定义错了。stack segment到stack ends定义了一个16字节的栈段。这段内存初值都是0名字叫stack本质上和data段没有区别只是程序约定用SS:SP去操作它。assume cs:code, ds:data, ss:stack是汇编期信息。它让汇编器在遇到ds:[si]这类寻址时知道DS对应哪个段从而计算正确的偏移。但它不会给mov ds, ax帮忙段寄存器的装载必须靠代码完成。代码里先执行mov ax, data; mov ds, ax把数据段的段地址装进DS。接着mov ax, stack; mov ss, ax; mov sp, 16这里mov ss, ax和mov sp, 16之间有一个微妙的地方8086在执行某些指令时会屏蔽中断但mov ss, ax之后最好马上设置SP否则中间如果来了中断SS是新的、SP还是旧的值栈就乱了。所以写程序时mov ss, ax和mov sp, 16要连着写。mov sp, 16是因为栈段总共16字节。栈空时SP应该指向栈顶“再往上”的位置也就是段内偏移16。第一次执行push ax时SP先变成14然后把数据写到SS:14处这正好是栈段的最后两个字。栈方向向下这个概念后面调试时会特别明显。3. 从编译到调试一步步验证多个段3.1 编译和连接的正确姿势我把上面的代码存成test.asm后执行masm test.asm。如果一切正常会看到类似0 Severe Errors的提示并生成test.obj。如果报错需要回看源文件常见错误是段名拼写不一致、标号重复、end start漏写以及指令助记符和操作数之间没打空格。接着执行link test.obj连接器会生成test.exe。这时可以顺手看一下生成的EXE文件大小虽然实验5的项目很小但已经能看出多段程序的EXE不像COM文件那么“裸”它带有一个文件头里面记录了程序入口、栈段偏移等信息这也是后面Debug能自动设置SS、SP的原因。真正调试时我建议进入Debug后不要急着用g跑完而是用u和t一步步看。先输入u反汇编从CS:IP开始的几条指令确认代码段内容无误。这一步有一个好处能看到mov ax, data指令后的立即数比如mov ax, 076A这个076A就是数据段地址用它可以手动查看数据段内存。3.2 程序加载后那些寄存器到底是怎么回事实验5有一个经典问题程序加载后DS、CS、SS、SP各指向哪里直接运行debug test.exe后输入r会看到类似这样的寄存器状态寄存器常见加载值说明CS076B代码段段地址IP0000指向代码段中start标号处SS0769栈段段地址SP0010栈段总长度16字节由EXE头自动设置DS0759不是data段而是程序段前缀PSP所在段ES0759和DS一样指向PSP关键点就在这里程序一加载CS、SS、SP已经被系统设置好了只有DS和ES还指向PSP。PSP是DOS为可执行程序分配的一块256字节前缀里面存了命令行参数等信息。如果你的代码不执行mov ax, data; mov ds, ax那么后面访问ds:[si]时DS指向的是PSP读到的东西根本不是你的数据。那能不能让系统自动把DS指向data段不能。因为一个程序可以定义好几个数据段EXE文件头并没有规定哪个是“主”数据段所以只能靠代码里手动加载。这就是实验5强调段寄存器初始化的原因。3.3 用Debug单步观察压栈和弹栈在Debug里我习惯这样一步步走先输入u查看代码确定各标号对应的地址。然后按t单步执行。执行完第一条mov ax, data后AX里就变成了数据段的段地址执行完mov ds, ax后DX看错了是DS变成数据段段地址。这时候输入d ds:0就能看到数据段里初始的16字节。继续单步到mov ss, ax和mov sp, 16之后输入r看SPSP应该等于0010。接着进入push_all循环。按一次t看到mov ax, ds:[si]中AX变成了0123h再按一次t执行push ax。此时输入rSP变成了000E输入d ss:0栈段末尾处出现了23 01。每次压栈SP减2数据从栈段的高地址向低地址填。当8个数据全部压完后SP回到0000不对仔细算初始SP16压入第1个字后SP14第2个后SP12第8个后SP0。所以压栈结束后SP0000栈段里16个字节被填满。这一点要特别留意否则你会以为SP应该还在某个中间位置。继续单步执行到pop_all第一次pop ds:[di]会把刚才最后压入的0987h弹出来写到数据段偏移0处SP变成0002。然后mov ax, ds:[si]当然这里已经换成pop流程是弹一个写一个。弹完后数据段前8个字变成逆序SP又回到0010栈段内容依旧留在那里只是SP不再指向它们。如果用g直接运行到int 21h之前也能看到最终结果。但单步执行更能让人看清“后进先出”到底是怎么回事。我建议至少完整按t走过一遍循环不要用p跳过。3.4 一张表看清压栈过程中栈的变化把压栈过程整理成表格一目了然操作压栈前SP压栈后SP栈顶两个字节内容push 0123h0010000E23 01push 0456h000E000C56 04push 0789h000C000A89 07push 0abch000A0008bc 0apush 0defh00080006ef 0dpush 0fedh00060004ed 0fpush 0cbah00040002ba 0cpush 0987h0002000087 09注意栈顶内容在内存里是小端序。比如0123h内存里是23 01Debug的d ss:0显示出来的会是87 09 ba 0c ed 0f ef 0d bc 0a 89 07 56 04 23 01也就是压栈后的完整内容。顺序刚好和原数据相反。弹栈时SP从0000往上走依次把87 09弹到数据段偏移0处把ba 0c弹到偏移2处最终数据段变成87 09 ba 0c ed 0f ef 0d bc 0a 89 07 56 04 23 01。写成字型数据就是0987h, 0cbah, 0fedh, 0defh, 0abch, 0789h, 0456h, 0123h逆序完成。4. 常见问题与排查技巧实录4.1 数据段地址没送到DS程序读到的是PSP现象程序运行后结果完全不对用Debug查看数据段发现里面的值和初始定义不一样甚至全是0。原因大概率是少写了mov ax, data; mov ds, ax。前面说过程序加载后DS指向PSP不初始化DSds:[si]读的就是PSP里的数据。排查方法很直接单步执行几条指令后r看DS如果DS和程序运行前一样说明没赋值。另外也可以在执行mov ds, ax前后各看一次d ds:0对比数据变化。这个错误几乎人人都会犯一次犯了之后印象最深。4.2 SP初始值不对栈直接盖到代码段栈段定义的是16字节SP却设成0会发生什么第一次push ax先把SP减2SP变成FFFE数据写到SS:FFFE。这个地址其实已经到了栈段之前的内存区域很可能就是别的段甚至覆盖到程序的其他部分。单步调试时会发现栈段里看不到数据程序执行一会儿就乱了。正确的SP值应该是“栈段字节总数”。如果栈段里写的是dw 0,0,0,0,0,0,0,0一共16字节SP就设16。如果写的是db 16 dup (0)SP也设16。如果写了dw 8 dup (0)同样是16字节。记住一个原则SP初始值等于栈段长度别去想着栈底在哪里。栈底是段内偏移0栈顶才是段内偏移SP。还有个小细节如果栈段定义了但代码里没设mov sp, 16系统会按EXE头里的信息自动设SP。但如果程序是实验题里那种“有意考你”的写法SP可能被设成0这时候你就要警惕题目可能在考察你对栈方向的理解。4.3 字和字节混用偏移量全错位dw定义的是16位字访问时偏移量要加2db定义的是8位字节访问时偏移量要加1。实验5的题目经常把db和dw混着出比如让你把8个字节逆序和把8个字逆序代码完全不同。如果该用字节却写成add si, 2你会跳着读数据把两个字节当成一个字处理最后结果看起来“好像反了”但数据细节全是错的。调试时可以用d ds:0逐字节看内存对照源码里的数据确认偏移步长。4.4 assume只是“声明”不是“赋值”assume ds:data常被误解为一个实际加载段寄存器的指令。不是。汇编器看到assume ds:data后在汇编mov ax, ds:[si]时知道应该按data段的偏移去计算但运行时DS里是什么值完全由机器代码决定。如果代码里没有mov ax, data; mov ds, axassume也不会帮你填值。这一点和高级语言很不一样高级语言里的声明和定义是链接器帮你安排的而汇编里段寄存器是CPU物理寄存器程序一跑起来就是裸状态不手动装载就没法用。4.5 调试多个段时的小技巧调试这种程序我常用的招数是先用u看前几条指令从mov ax, 立即数里找出data段地址再用d 地址:0查看数据段不用等程序跑完。单步进入循环前先用r记下SP和CX的初始值每按几次t就对比一次能直观看到SP逐步减少、CX逐步减少。不想一步步跑完整个循环时可以在pop_all循环开始处设置一个断点用g 地址直接跑到那里再单步观察。计算地址时用u查看pop_all标号前的指令偏移注意Debug显示的是段内偏移比如在代码段偏移0034处。如果执行到int 21h时按t可能会一头扎进DOS中断的内部界面变得很奇怪。遇到int 21h直接按p让中断返回或者用g停在它前面别用t硬跳。这些技巧都是我在反复调试中总结的能节省大量时间。5. 从实验5延伸出去的一点思考5.1 为什么DS不能像CS、SS那样自动指向数据段程序加载时CS自动指向代码段SS自动指向栈段DS却不指向任何一个数据段这个不对称让很多人困惑。原因是EXE文件头里明确记录了代码段入口和栈段偏移加载器可以直接写CS、IP、SS、SP但数据段不唯一程序可能有多个所以没有“默认识别”的机制。CS和SS可以靠头部信息确定DS只能靠程序自己确定。这也解释了“段的本质是逻辑划分”这句话。8086的段寄存器只是四组地址参考点你可以让DS指向数据段也可以让它指向代码段甚至可以指向栈段。实验5的练习虽然简单但多段结构的灵活性已经从这些寄存器分配里体现出来了。5.2 多段程序的内存布局和重定位EXE文件加载到内存时并不是像COM文件那样原样搬过去就完事。EXE头里有重定位表加载器会根据程序被加载到哪个基地址动态修正代码中所有“段地址”相关的立即数。比如源码里写mov ax, data编译后这个data在EXE里是一个可重定位的值加载时会加上一个基址偏移。所以每次运行同一个EXEDS、CS、SS的段地址可能不一样但它们的相对关系不变。这也是为什么你在Debug里看到的段地址和我这里举例的076A未必相同但程序行为完全一样。多个段的程序跳转、栈操作、数据访问用的都是相对段地址重定位不影响逻辑。5.3 一个更贴近实战的扩展练习如果实验5做完还有余力我建议尝试一个变体定义两个数据段一个装着8个字另一个装着8个字把两者对应位置相加结果放回第一个数据段。这个练习看起来只是多了些指令但你会遇到一个实际痛点DS只有一个访问第二个数据段时需要先让DS指向第二个数据段访问完再切回第一个。一开始我写的代码是直接来回改DS结果发现循环里数据访问错位得厉害。正确做法是把第一段的段地址先压栈保存需要时再弹出来或者用两个通用寄存器分别保存两个段地址然后用段超越前缀es:[si]和ds:[si]同时访问两个段。这两种做法都指向一个核心段寄存器的分配和管理是多段程序最需要设计好的地方。写完这个练习你对实验5的理解会比只抄一遍示例程序深得多。6. 我做这个实验的个人经验实验5我前后做了三遍第一遍是照着样例改第二遍是空手重写第三遍是故意写错几个地方再调。最大收获不是会背那个逆序程序而是终于看懂了Debug里CS、DS、SS、SP是怎么配合的。以前调程序全凭感觉现在拿到一个EXE先看反汇编第一条指令的立即数再看SP初始值心里基本就有数了。如果你也在做这个实验我真心建议不要只满足于把代码跑通。试着在Debug里单步走完每一次push和pop把栈段内存的变化画在纸上标出SP每次指向哪里。这个动作看起来很笨但做完之后多个段的程序对你来说就不再是一堆零散的传送指令而是一幅清晰的内存地图。以后学到中断、子程序、模块化设计很多问题都能从这幅地图里找到答案。

相关新闻

个性化搜索排序实践:层级RNN与查询感知注意力方案

个性化搜索排序实践:层级RNN与查询感知注意力方案

搜索排序这行干久了都会碰到一个很典型的矛盾:你用一堆特征维度的排序模型把点击率做到某个瓶颈之后,再继续堆特征,收益会越来越小。用户的历史行为明明就在日志里躺着,但你不知道怎么把“这个人最近三天内反复比较过什么类型的商…

2026/10/14 9:44:24 阅读更多 →
用litellm构建统一模型网关:多模型接入、路由与成本追踪实战

用litellm构建统一模型网关:多模型接入、路由与成本追踪实战

上个月我接手了一个内部AI平台的项目,代码里到处散落着各家大模型API的调用逻辑,有的用官方SDK,有的直接拼HTTP请求,还有几个服务是自己封了一层又一层。出了问题找起来特别痛苦:一会儿是"这个模型超时了"&a…

2026/10/14 9:43:23 阅读更多 →
基于Python协同过滤与Django的动漫推荐系统实战

基于Python协同过滤与Django的动漫推荐系统实战

简介:本资源为基于Django与Python协同过滤算法实现的动漫推荐系统完整项目,面向计算机相关专业毕业设计学生及推荐算法入门开发者,可解决从零搭建推荐系统、理解协同过滤落地流程的实际问题。项目围绕用户管理、动漫信息展示与用户行为交互三…

2026/10/14 9:43:23 阅读更多 →

最新新闻

家电品牌出海GEO优化公司推荐:家电品牌如何判断服务商实力

家电品牌出海GEO优化公司推荐:家电品牌如何判断服务商实力

家电品牌做 GEO,首先要解决的是信息能否被 AI 讲对。型号、容量、认证、安装和售后等内容,都需要按目标市场整理,并通过持续监测验证实际呈现。 家电品牌在评估广拓时代CantoTimes时,可以重点看其自研系统、产品资料整理、海外内容…

2026/10/14 13:31:30 阅读更多 →
动力电池液冷板内部流道5类结构设计要点与Fluent散热效果对比分析方法详解

动力电池液冷板内部流道5类结构设计要点与Fluent散热效果对比分析方法详解

动力电池液冷板是电池热管理系统的核心部件。其内部流道结构直接决定电芯温度均匀性和系统压降。设计不当会导致局部过热、温差过大、泵耗过高等问题。本文从流道设计基础出发,梳理5类常见流道结构,并说明用Fluent进行散热效果对比分析的方法。一、流道设…

2026/10/14 13:31:30 阅读更多 →
显存不够怎么降?本地跑大模型的 5 级降级顺序表(8G 实测)

显存不够怎么降?本地跑大模型的 5 级降级顺序表(8G 实测)

8G 卡跑 14B 直接 OOM,我是怎么一步步退下来的 前两天在一张 8G 的老卡上加载一个 14B 的 Q4_K_M,Ollama 那边直接报内存不够,换 llama.cpp 加载也是分配失败。我的第一反应是"换更低的量化档",结果换完照样起不来。后来…

2026/10/14 13:31:30 阅读更多 →
电商AI搜索优化无效的原因及解决策略

电商AI搜索优化无效的原因及解决策略

引言在当前的电商环境中,AI搜索优化(AI Search Optimization, AISO)已成为提升用户体验和转化率的重要手段。然而,许多企业在实施AISO时遇到了效果不佳的问题。本文将探讨电商AI搜索优化无效的原因,并提出相应的解决策…

2026/10/14 13:31:30 阅读更多 →
心理学在员工激励和团队管理中的应用(总监ppt)

心理学在员工激励和团队管理中的应用(总监ppt)

将员工动机与团队协作研究转化为具体管理动作,覆盖目标设定、奖励认可、公平规则、心理安全、绩效反馈与冲突处理,并配套场景分析、效果评估和90天实施路线,适用于管理者培训、团队建设及人力资源管理交流。 表格解读一:员工激励机…

2026/10/14 13:31:30 阅读更多 →
Unity 2020+ Prefab光照烘焙失效原因与修复方案

Unity 2020+ Prefab光照烘焙失效原因与修复方案

1. 项目概述:为什么Prefab烘焙突然“不香了”?2020年前后,Unity3d开发者圈里频繁出现一个扎心现象:明明在Scene视图里光影效果完美,一打包成Build或切换到Game视图,模型突然变灰、阴影消失、Lightmap全黑—…

2026/10/14 13:30:30 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →