Dancing Naked in the Mind Field

本书《心灵裸舞》由诺贝尔化学奖得主Kary Mullis撰写,书中不仅分享了他的生活趣事,还深入探讨了科学信仰及科研领域的监督与制衡等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  《Dancing Naked in the Mind Field》(中文译名:心灵裸舞)是我这两天看完的一本很有趣的自传。作者:Kary Mullis。他因发明PCR技术获得1993年诺贝尔化学奖。这个人是冲浪爱好者,吸过毒,喜欢美女擅长泡妞,至少结过四次婚,而且对这一切都毫不讳言。他曾被异形附体,曾服用笑气过量。他不担心全球变暖,但恐惧外太空天体撞击。他跟儿子记仇,比谁更傻,他还替另一个儿子向瑞士16岁的公主求婚。他通过看或不看《花花公子》控制邻居门口的灯,他参与辛普森案审理过程中还在问被告一美女啦啦队长的电话号码。他曾跟日本皇后聊得很high,也在见克林顿希拉里之前打了邪恶的小算盘。令人欣慰的是,这本书总共才150页~

  我喜欢看这种率性、不做作的人写的东西。既简洁又诙谐,绝对是个特别热爱生活的人。看的时候我经常在笑。O(∩_∩)O~

  然而,这本书深深吸引我的,是其中关于科学信仰的部分。虽然书写于1999年,但其关注的问题与现象,走过十年,依旧存在甚至更加严重。作者讨论美国三权分立的宪政民主体制,发现在科研领域实现监督与制衡十分必要却特别困难。科学争论往往同道德纠缠不清。科研的动力应该是追求最大的经济利益,还是强烈的好奇心?许多科学家坚决拒绝以中立的、不带偏见的态度检验可能的证据,这令人失望。科研经费的分配盲目而功利。人类是因为害怕黑暗或死亡才趾高气扬,才自认为是万物之主和地球的保护者。这些方面的内容渗透于很多章节中,非常精彩。

  开学之初我看了一个纪录片——《优雅的宇宙》,没有因此迷上string theory,但被那些物理学家的研究态度深深打动,有种关于“科学精神”的力量在脑子里挥之不去。一个多月之前看了一本名为《疯狂实验史》的书,介绍了很多著名的、争议很大的、搞笑的实验。疯狂本身不是目的,它只不过说明了人类的求知欲。看了《心灵裸舞》之后,我把这三样东西联系起来想了一想。既然我还是要在学术界混几年的人,在这个时间点上,准备一点立场和价值观,还是很不错的嘛...

  去年吧,看见一句话:只有正常的体制才会有正常的教育,只有正常的教育才会输出正常的价值观。前几天看《新周刊》说:中国目前正在经历道德与价值观迅速崩塌的时期。我觉得是。我想起中国是《Science》拒稿率最高的国家。想起前几天还得了个奖的方舟子那个神经病...最近丁香园还公布了大陆这几年因为学术不端而遭遇撤稿的论文(《九十九朵凋谢的玫瑰》)。我看我们这大学上的吧,抄报告,该数据,凑结果,还真没看出啥“科学精神”来。一直在模仿,从没去超越。不求真,“务实”倒有一点儿...这又让我想起这里这篇文章。我很少抱怨与怪罪体制,我总是相信有叫做“主观能动性”的一样东西。主观能动性遭遇固有价值观,战斗是相当惨烈啊...我想到那个叫SUSTC的新大学。我又想到之前很热闹的“国考”,考碗嘛。摘录两条我看着很顺眼的言论:

  全社会精英人士都向食利阶层挤,而不是投身财富创造者阶段,这个社会注定是变态的。(via:@周泽谈案说法

 

  父母必读本:给毕业生最可怕的毕业礼物1)告诉孩子该怎么走,因为你知道更多,2)要孩子去找份安稳无意义的工作,不要追随自己的心,3)靠关系安排孩子的工作,4)让孩子弥补自己未完成的遗憾,5)给孩子犯罪感和压力,让他们回到你身边工作(虽然并非真正年老需要照顾)。(via:@李开复

 

  我感觉我不该想这么多,说得很乱,完全没理清楚~

  还是推荐一下这本书。Kary Mullis是个敢说真话的人,是一位有责任心有良知的知识分子。《心灵裸舞》是一本很特别很值得一读的自传。在我们学校的索书号为:K837.126.13 2.

 

转载于:https://www.cnblogs.com/rainywh269/archive/2010/12/21/1911958.html

<think>好的,我现在要处理用户的问题:“non-asm statement in naked function is not supported”。首先,我需要理解这个错误信息的含义以及常见的出现场景。用户可能在使用C或C++编程,特别是涉及到内联汇编或者裸函数(naked function)的时候遇到了问题。 首先,我得回忆一下裸函数的概念。裸函数通常是指没有编译器自动生成函数入口和退出代码的函数,这样开发者可以完全控制函数的汇编指令,常用于底层开发或需要精确控制寄存器和栈的情况。在GCC或Clang中,可能使用`__attribute__((naked))`,而在MSVC中,可能使用`__declspec(naked)`来声明这样的函数。 错误信息指出在裸函数中存在非汇编语句,也就是说函数体内包含了普通的C/C++代码,而编译器不允许这样做。裸函数通常要求函数体完全由内联汇编组成,否则编译器无法生成正确的代码,因为缺少了正常的函数框架。 接下来,我需要考虑用户为什么会遇到这个问题。可能的情况包括: 1. 用户可能在裸函数中混合使用了汇编代码和普通C语句,比如变量声明、赋值、控制流语句等。 2. 用户可能误以为裸函数可以像普通函数一样编写,只是不需要处理函数调用开销,但实际上必须完全用汇编指令编写。 3. 用户可能没有正确使用编译器扩展或语法,导致编译器无法识别函数体内的内容。 接下来,我需要考虑如何解释这个问题,并给出解决方案。首先,应该明确裸函数的定义和限制,然后指出错误的原因,再给出修改的步骤和示例。 可能还需要比较不同编译器中的实现差异,比如GCC和MSVC在裸函数处理上的不同要求。例如,GCC的`__attribute__((naked))`允许在函数中使用`asm`语句,但可能不允许其他C语句,而MSVC的`__declspec(naked)`可能有类似限制,但具体表现可能不同。 另外,需要提醒用户注意在裸函数中手动处理函数参数、返回地址、寄存器保存等细节,因为编译器不会自动生成这些代码。否则,可能导致运行时错误,如栈不平衡或寄存器状态混乱。 还需要考虑用户可能的后续问题,比如如何在裸函数中正确访问参数和局部变量,或者如何混合使用汇编和C代码,可能需要提供进一步的指导或示例。 最后,应该总结解决这个问题的关键点,并给出避免类似错误的建议,比如仔细阅读编译器文档,使用适当的工具进行调试,以及遵循裸函数的最佳实践。</think>### **1. 错误解释** **“non-asm statement in naked function is not supported”** 表示在声明为 **`naked`** 的函数中,存在非汇编代码(如普通C/C++语句)。裸函数(naked function)要求开发者**完全手动控制函数入口和出口的汇编指令**,因此编译器禁止函数体内出现任何非内联汇编语句。 --- ### **2. 根本原因** - **裸函数的本质**:`naked` 函数不会由编译器自动生成函数序言(prologue)和尾声(epilogue),例如: - 保存寄存器(如 `push ebp`) - 栈指针调整(如 `mov ebp, esp`) - 返回指令(如 `ret`) - **编译器的限制**:若在裸函数中编写普通C/C++代码(如变量赋值、函数调用等),编译器无法自动生成对应的汇编指令,导致逻辑错误或崩溃。 --- ### **3. 常见场景** #### **(1) 错误代码示例(以GCC/Clang为例)** ```c __attribute__((naked)) void my_naked_func() { int x = 10; // 错误!普通C语句 printf("%d", x); // 错误!函数调用 } ``` #### **(2) 错误代码示例(以MSVC为例)** ```c __declspec(naked) void my_naked_func() { int x = 10; // 错误! printf("%d", x); // 错误! } ``` --- ### **4. 解决方案** #### **(1) 原则:仅使用内联汇编** 裸函数体内必须**完全由汇编指令**组成,所有操作(包括参数访问、局部变量分配、函数返回)需手动控制。 #### **(2) 正确示例(GCC/Clang)** ```c __attribute__((naked)) void my_naked_func() { asm volatile ( "push {lr} \n" // 手动保存返回地址(ARM架构示例) "mov r0, #10 \n" "bl printf \n" // 调用printf(需手动处理参数传递) "pop {lr} \n" "bx lr \n" // 手动返回 ); } ``` #### **(3) 正确示例(MSVC x86)** ```c __declspec(naked) void my_naked_func() { __asm { push ebp // 手动保存栈帧 mov ebp, esp push 10 // 参数压栈 call printf // 调用printf pop ebp ret // 手动返回 } } ``` --- ### **5. 关键注意事项** #### **(1) 手动处理函数参数和返回值** - **参数访问**:需通过寄存器或栈地址直接操作(如x86中`[ebp+8]`访问第一个参数)。 - **返回值**:需手动设置返回值寄存器(如x86中`eax`,ARM中`r0`)。 #### **(2) 栈平衡** - **调用其他函数前**:需手动保存寄存器并调整栈指针。 - **函数返回前**:需恢复栈指针和寄存器状态,避免栈溢出或崩溃。 #### **(3) 避免编译器优化** 使用 `asm volatile`(GCC/Clang)或 `__asm {}`(MSVC)确保汇编代码不被优化器移除。 --- ### **6. 替代方案** 若需混合使用汇编和C代码,可尝试以下方法: 1. **分离汇编和C代码**: ```c void normal_func() { int x = 10; printf("%d", x); } __attribute__((naked)) void my_naked_func() { asm volatile ("bl normal_func \n"); // 从汇编跳转到普通函数 } ``` 2. **使用内联汇编块**(非裸函数): ```c void my_func() { int x; asm volatile ("mov %0, #10" : "=r"(x)); // 内联汇编与C代码混合 printf("%d", x); } ``` --- ### **7. 总结** - **核心要求**:裸函数必须完全用汇编指令编写。 - **典型错误**:包含C/C++语句或依赖编译器生成的栈操作。 - **关键操作**:手动控制函数入口、出口、参数传递和栈平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值