作 者: 王仁军 时 间: 2008-06-15,20:25 链 接: http://bbs.pediy.com/showthread.php?t=66624 comment *----------------------------------------------------------------------- 前几日,几个朋友在局域网中玩红警对战,常因游戏中无钱而使战斗长时间不能结束, 有人就想到用游侠修改金钱来作弊,无奈在网络对战中用游侠修改游戏是要暂停游戏的,一 人停下大家都停了,作弊就被人发现了。能不能整它个一键锁定,神不知鬼不觉,不被人发 现?于是我就编写了这个“傻瓜式RA2游戏修改器”。为什么没有去破解游戏或做补钉呢?那 样的话别人玩这个机子的RA2游戏也能享受作弊待遇了,且钱数不变易被人发现作弊了:) 用法: ①把本程序拷到RA2游戏目录中,运行本程序,游戏程序被启动了 ②开始一场战斗,切记,等游戏界面显示的钱数“不变”时,按下数字键盘上的星号键 第一遍搜索开始了,也许要好几秒时间,这段时间内你可以点兵派将,但不可使钱数增减。 ③当你听到提示音且鼠标被置于屏幕左上角时,第一遍搜完了。现在赶紧让你的钱数变 化,比如建一座电站,最好是钱数再次“不变“时,可以按下数字键盘上的星号键进行第二 遍搜索了,这次是极极极的快,鼠标没有被置于左上角,说明找到正确地址并已自动锁定钱 数了。什么?钱数在变化没有锁定?非也!五秒之内你用钱了自然要减少挣钱了自然要增加 不然旁观者看到钱数不变就知道你作弊了:),这是不同于游侠的地方,要的就是这个效果。 当一场战斗终了,要开始下一场战斗时,你只要按一下“-”键,然后重复上述步骤即 可。为什么要重新搜索?因为每一盘游戏的金钱数地址都不同。 本程序在WinXP/SP2、ra2之1.006英文版(有中国超牛机器人的那个)运行通过且稳定 无误。如果是其他版本,只要用十六进制编辑工具搜索数值“008373cch”,改为你想要的 地址值即可,共有两处要改。这个地址值是怎么得来的?最简单的方法是用游侠了。有游侠 为啥还要用我这个破玩意儿?因为游侠的界面和暂停会让别人发现你作弊的。用游侠搜索到 的地址一般有三个,有两个地址值相差4,取较小的那个即可,最大的也是最另类的那个每 盘游戏都会变,它才是正直的金钱数保存地址,本程序就是要找到这个变化的地址并锁定数 值。 对于那些弹出游侠界面或暂停后就死掉的游戏,用类似的方法就可以修改了吧?!如果 数值地址不是象ra2这样有多个,可在游戏中记下几个数值,然后写入一文件中,搜索时从文 件中读取数值即可。也可用键盘钩子记录按键,进行无界面动态输入。 *------------------------------------------------------------------------------- .586 .model flat,stdcall option casemap:none include windows.inc include kernel32.inc include user32.inc include psapi.inc includelib kernel32.lib includelib user32.lib includelib psapi.lib ADD_DATA1 equ 008373cch ;00883c84h ;其他版本要改这个地址值 ;ADD_DATA2 equ 008373d0h ;00883c88h ;这个不用 ADD_DATA3_START equ 01000000h ;搜索范围开始地址,可根据需要改动 ADD_DATA3_END equ 0f600000h ;搜索范围结束地址,可根据需要改动 MEMSIZE equ 10000h ;每次读取数据块的大小,不宜太小 .code ;------------------------------------------------------------------------ ;取得游戏进程的句柄。游戏中按下“*”号键便来到这里 ;有两种常用的方法:进程快照查找法和当前活动窗口法 ;------------------------------------------------------------------------ _GetProcessHandle proc comment *在调试时用这段代码取得游戏进程的句柄为好 LOCAL info:PROCESSENTRY32 LOCAL handle:HANDLE invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0 ;进程快照 mov handle,eax mov info.dwSize,sizeof PROCESSENTRY32 invoke Process32First,handle,addr info .repeat mov eax,@F invoke lstrcmpi,addr info.szExeFile,eax ;比较是否为我们要找的进程名,不区分大小写 .if !eax invoke CloseHandle,handle ;invoke MessageBox,NULL,addr info.szExeFile,NULL,MB_OK invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,info.th32ProcessID jmp EXIT .endif invoke Process32Next,handle,addr info .until !eax invoke CloseHandle,handle xor eax,eax EXIT: ret @@: db "Game.exe",0 *通常情况下也可以用下面的方法取得游戏进程的句柄,但要注意…… LOCAL ProcessId invoke GetForegroundWindow ;你必须确保当前窗口为游戏界面窗口,这样才能正确取得游戏进程ID lea edx,ProcessId invoke GetWindowThreadProcessId,eax,edx invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,ProcessId ret _GetProcessHandle endp ;------------------------------------------------------------------------ ;第一遍搜索。因是全程搜索,耗时几秒至十多秒(与玩家数多少有关),WinXP中 ;凭经验知道本游戏中钱数地址在01000000h至0F600000之间,搜此范围以减少用时 ;------------------------------------------------------------------------ _GetDataAddr proc uses esi edi hProcess:DWORD,num:DWORD,hmem:DWORD LOCAL N,ListMemSize,pListMem,ReadSize LOCAL mbi:MEMORY_BASIC_INFORMATION invoke EmptyWorkingSet,hProcess ;减少游戏进程提交内存数,希望能减少搜索量,加快搜索速度 invoke SetProcessWorkingSetSize,hProcess,-1,-1 ;不知是否有效?!愿听高手指导 invoke GlobalLock,hmem ;锁定保存搜索结果的内存 mov pListMem,eax invoke GlobalSize,hmem;保存搜索结果的内存大小 mov ListMemSize,eax invoke ReadProcessMemory,hProcess,ADD_DATA1,addr N,sizeof N,NULL ;不用手输入金钱数,从内存读取金钱数 mov edi,N ;保存金钱数,以便后面比较搜索,原理见前文 invoke GlobalAlloc,GMEM_FIXED,MEMSIZE ;分配内存,为读取数据做准备 mov esi,eax ;保存内存地址 mov ecx,ADD_DATA3_START ;设置要搜索的内存地址范围开始处 .repeat ;循环搜索游戏内存 @@: invoke VirtualQueryEx,hProcess,ecx,addr mbi,sizeof MEMORY_BASIC_INFORMATION ;返回页面虚拟信息 .if mbi.State == MEM_COMMIT && mbi.Protect == PAGE_READWRITE ;已提交且为可读写的区域,加速搜索 mov ReadSize,MEMSIZE ;每次可读取的数据大小 .repeat ;循环读取该内存区段中的数据 .if mbi.RegionSize<MEMSIZE ;如果剩下的数据块小于MEMSIZE mov eax,mbi.RegionSize mov ReadSize,eax ;读剩下的数据大小 .endif invoke ReadProcessMemory,hProcess,mbi.BaseAddress,esi,ReadSize,addr N ;读游戏数据 xor ecx,ecx ;ecx为相对于区段首的偏移地址 .repeat ;在读取的数据块中搜索金钱数的地址 .if edi==[esi+ecx] ;数值相等,找到了? mov eax,num ;地址num中记录了搜索结果的个数 inc dword ptr[eax] ;搜索的结果个数加一 mov eax,dword ptr[eax] shl eax,2h ;保存结果所需的内存大小 .if eax>ListMemSize ;如果搜索到的结果较多,内存用完,要重新分配内存 push eax push ecx add eax,1000h ;追加4K内存 invoke GlobalReAlloc,hmem,eax,GMEM_MOVEABLE ;重新分配内存,原来的数据被复制过来 invoke GlobalLock,eax mov pListMem,eax ;保存搜索结果的内存首地址 invoke GlobalSize,hmem mov ListMemSize,eax ;保存搜索结果的内存大小 pop ecx pop eax .endif add eax,pListMem ;相当于pListMem[num] mov edx,mbi.BaseAddress add edx,ecx ;首地址+偏移地址=实际地址 mov [eax-4h],edx ;搜索的结果保存起来,pListMem[num-1]=实际地址 .endif add ecx,4h ;金钱数为DWORD型数值,考虑到内存对齐,这里是不用担心漏掉的 .until ecx>=N ;读取的数据块比较完了吗? mov eax,ReadSize ;准备再读一次 add mbi.BaseAddress,eax ;下次从这里开始读 sub mbi.RegionSize,eax ;下次要读的大小 .until mbi.RegionSize<=0h ;下次要读的大小为0了吗?为0则本区段读完,去下一区段 .endif mov ecx,mbi.BaseAddress add ecx,mbi.RegionSize ;下一区段首地址 .until ecx>=ADD_DATA3_END ;下一区段在搜索范围之外了吗?是则完成第一遍搜索 invoke GlobalFree,esi ret _GetDataAddr endp ;------------------------------------------------------------------------ ;第二、三……遍的搜索,在第一次的结果中找,速度极快 ;第二次按下“*”键便来到这里,一般只要两遍就可锁定。算法:有用地址向前移 ;结果个数由num返回,如果num==1就算找到正确的金钱地址了 ;------------------------------------------------------------------------ _FindAddrInList proc uses edi esi hProcess:DWORD,num:DWORD,hmem:DWORD LOCAL Data,N LOCAL DD1,DD2 invoke ReadProcessMemory,hProcess,ADD_DATA1,addr DD1,sizeof DD1,NULL ;读取金钱数 invoke GlobalLock,hmem mov edi,eax ;前次搜索结果保存的内存首地址 xor esi,esi ;指针,指向第一个结果 mov N,esi ;本次搜索到的个数初始化为0 .repeat ;逐个比较 mov edx,[edi+esi*4h] ;相当于edx=hmem[esi] invoke ReadProcessMemory,hProcess,edx,addr DD2,sizeof DD2,NULL ;读取数值 mov eax,DD1 .if eax==DD2 ;等于金钱数吗?等则记录下来 push [edi+esi*4h] mov eax,N pop [edi+eax*4h] ;相当于hmem[N]=hmem[esi],即把搜索到的结果向hmem内存前面移 inc N ;搜索到的个数加一 .endif mov eax,num inc esi ;指针指向下一个结果 .until esi>=[eax] ;每个都比较过了吗?是则完成这次搜索 mov edx,N ;这次搜索到的结果个数 mov [eax],edx ;修改原来的个数 shl edx,2h ;个数×4=内存大小 invoke GlobalReAlloc,hmem,edx,GMEM_MOVEABLE ;释放多余的内存 ret _FindAddrInList endp ;------------------------------------------------------------------------ ;找到了正确的地址,可以锁定金钱数值了:),每五秒锁定一次,按“-”键停锁 ;游戏中钱数看起来有增有减,象未锁定一样,别人不容易发现你作弊 ;------------------------------------------------------------------------ _WriteProcessData proc uses edi esi hProcess:DWORD,hmem:DWORD LOCAL DATA,IsRun mov esi,2000 ;要锁定的金钱数,别太多,多了是会招贼来偷的:) mov DATA,esi invoke GlobalLock,hmem mov edi,[eax] ;游戏中真正的保存金钱数的地址 .repeat .if esi>=5h ;每五循环锁定一次 xor esi,esi ;循环次数清0 invoke WriteProcessMemory,hProcess,edi,addr DATA,sizeof DATA,NULL ;写入钱数 .endif invoke Sleep,1000 ;定时一秒 inc esi ;循环次数加一 invoke GetExitCodeProcess,hProcess,addr IsRun ;游戏程序还在运行吗? invoke GetAsyncKeyState,VK_SUBTRACT ;按了“-”键吗? .until eax || IsRun!=STILL_ACTIVE ;如果游戏退出或按了“-”键则结束循环 ret _WriteProcessData endp ;------------------------------------------------------------------------ ;把本程序拷入游戏文件夹,运行本程序,游戏被启动,本程序在后台运行,无界面 ;本程序运行后启动“ra2.exe”,再由“ra2.exe”启动游戏程序,之后“ra2.exe” ;无用了,停掉它以节约内存。 ;------------------------------------------------------------------------ _StartGame proc LOCAL StartInfo:STARTUPINFO LOCAL PI:PROCESS_INFORMATION invoke RtlZeroMemory,addr StartInfo,sizeof STARTUPINFO mov StartInfo.cb,sizeof STARTUPINFO mov ecx,GAME_NAME xor edx,edx invoke CreateProcess,edx,ecx,edx,edx,edx,edx,edx,edx,addr StartInfo,addr PI ;启动游戏 invoke Sleep,10000 ;等10秒,游戏程序应该启动了吧? invoke TerminateProcess,PI.hProcess,0h ;没用了,停掉它 invoke CloseHandle,PI.hProcess ;释放内存 ret GAME_NAME: db "ra2.exe",0 _StartGame endp start: MAIN proc LOCAL msg:MSG LOCAL num,hmem,hProcess,MutexName invoke _StartGame ;启动游戏 mov eax,"2ar" mov MutexName,eax invoke CreateMutex,NULL,TRUE,addr MutexName invoke GetLastError .if eax!=ERROR_ALREADY_EXISTS ;只让本程序的一个实例运行 invoke RegisterHotKey,NULL,VK_MULTIPLY,0h,VK_MULTIPLY ;注册热键“*” invoke RegisterHotKey,NULL,VK_SUBTRACT,0h,VK_SUBTRACT ;注册热键“-” invoke RegisterHotKey,NULL,'X',MOD_CONTROL OR MOD_ALT,'X' ;注册热键“Ctrl+Alt+X” invoke GlobalAlloc,GMEM_MOVEABLE,1000h ;预留内存空间,搜索时用来保存结果 mov hmem,eax ;搜索结果个数的不确定性需要我们用GlobalReAlloc来重新分配内存大小 xor eax,eax mov num,eax ;搜索结果个数初始化为0 mov hProcess,eax ;始化为0 .while 1 invoke GetMessage,addr msg,NULL,NULL,NULL ;等待消息 .if msg.message==WM_HOTKEY ;热键消息 .break .if msg.wParam=='X' ;按了热键“Ctrl+Alt+X”则退出本程序 .if msg.wParam==VK_SUBTRACT ;按了热键“-” mov num,0h ;搜索结果个数置0,表示从未搜索过 .else ;按了热键“*” .if num==0h ;搜索结果个数为0则从未搜索过,进行第一遍搜索 .if hProcess ;如果在非游戏界面中按了“*”,这样可避免误操作 invoke CloseHandle,hProcess ;释放内存 .endif invoke _GetProcessHandle ;取游戏进程句柄 mov hProcess,eax lea ecx,num ;指针型参数 invoke _GetDataAddr,eax,ecx,hmem .elseif num>1h ;搜索结果个数非0则至少已搜过一遍且未找到正确地址 invoke _FindAddrInList,hProcess,addr num,hmem ;再搜它一遍或几遍 .endif .if num==1h ;搜索结果为1,说明找到正确地址了 invoke _WriteProcessData,hProcess,hmem ;去锁定它! .break .if eax==0 ;如果你没按“-”键,那一定是游戏退出了,咱也退出吧 .endif .endif invoke MessageBeep,MB_OK ;发声提示游戏者,按键收到,该做的本程序都做过了 invoke SetCursorPos,9h,9h ;把鼠标置于屏幕左上角,提醒游戏者,第一遍搜索时特别有用 invoke GetCurrentProcess invoke EmptyWorkingSet,eax ;减少自己的内存占用量,不和游戏争内存 .endif .endw invoke UnregisterHotKey,NULL,VK_MULTIPLY ;以下为退出前的清理工作 invoke UnregisterHotKey,NULL,VK_SUBTRACT invoke UnregisterHotKey,NULL,'X' invoke CloseHandle,hProcess invoke GlobalUnlock,hmem invoke GlobalFree,hmem invoke ExitProcess,NULL .endif ret MAIN endp end start
相关推荐
visual c++ vc修改其它进程的内存值,写游戏修改器,内存修改器用
visual c++ vc修改其它进程的内存值,写游戏修改器用.zip
一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)
RDMA作为一种高效的网络通信技术,可以大大提高网络通信的性能和效率。通过硬件直接访问远程内存,RDMA避免了传统网络通信中的多次数据拷贝和上下文切换的开销,特别适用于高性能计算、大数据处理、分布式存储等场景。掌握RDMA的编程接口和编程技术,可以为构建高效的网络应用提供有力的支持。
易语言使用汇编读写内存模块
易语言使用汇编读写内存模块源码 系统结构:asm_读整型内存,asm_读短整型内存,asm_读字节集内存,asm_写整型内存, ======程序集1 | | | |------ _启动子程序 | | | |------ _临时子程序 | | | |------ a
易语言编程-手把手教你解除游戏保护-让CE可搜索读写游戏进程内存数据
3. 如何解除游戏进程保护,从而CE工具 以及 自己写的代码可以 正常读写内存数据?解除一些有保护的游戏 64位系统上的内存保护机制,因为它无法让CE工具搜索内存的保护,编写代码实现 读写进程数据 正常 ,以及CE工具可以搜索读写内存数据等操作。1. 游戏进程为什么无法读写内存数据,CE工具为何不能搜索数据?就读写有保护的游戏内存数据,就非常方便开发有保护的游戏内存辅助了,game-ec USB模块里的驱动强制读写。只用于逆向技术交流,切勿用于其它!答案:因为被保护起来了。答案:因为被保护起来了。
Windows下用Caddy一键搞定LiveKit本地HTTPS部署(含自签名证书避坑指南)
本文详细介绍了在Windows本地开发环境中,如何利用Caddy服务器一键部署支持HTTPS和WSS的LiveKit实时通信服务。文章重点解决了自签名证书的生成与配置难题,提供了完整的避坑指南和防火墙设置,帮助开发者快速搭建安全的WebRTC测试环境,实现局域网内的实时音视频互动。
2019美亚杯团体赛刷题 部分题解(1-42、106-116)
文章目录写在前面使用工具刷题1.在黑客路由器里,有一台设备的MAC地址为00:11:6B:47:4D:55,请问它的IP地址是什么?2.在黑客路由器里,发现一设备的IP地址为192.168.0.103,请问该设备为如下哪一个:3.警方已经查证所有连接此router的设备都归黑客所有,根據黑客路由器的訊息,下列哪组(设备---ip)是错误的:4.Hacker现场检获的Windows主机硬盘已成功取证并制作成镜像Win1.E01,下列哪个是其硬盘证据文件的MD5哈希值。5.MD5hash算法会产生一个什么大小的
如何在NP下读写游戏内存及如何进入NP进程
在上一篇文章《反NP监视原理》中说到要去掉NP的注入是很容易的事,但是去掉npggNT.des并不是说我们想对游戏怎么样都可以了,NP还挂钩了很多内核函数,所以很多关键系统函数就算我们在用户层能用也对游戏没有什么效果。 如果我们想在不破解NP前提下读写游戏内存该怎么办呢,我想办法至少有两个一、用驱动 在驱动下读写游戏内存是没问题,但是由于我不懂驱动,所以也没什么可说。二、进入游戏进程 在用户层,如
Cadence IC618与Spectre231安装配置全攻略:License、环境变量与依赖检查
EDA工具部署中,License管理与环境变量隔离是核心难点。FlexLM作为通用授权机制,通过守护进程和端口配置实现工具授权;环境变量则控制工具路径与库加载顺序,避免版本冲突。合理配置可确保IC618与Spectre231稳定运行,提升仿真效率。典型应用场景包括模拟IC设计、高校实验室及企业级EDA环境。本文聚焦Cadence IC618与Spectre231的安装实践,详解License配置、环境隔离及依赖检查,助你快速搭建可靠设计环境。
游戏作弊-内存读写原理
第一课我们浅解安卓ROOT手机如何修改游戏内存 在当前流行的FPS,MOBA游戏中,我们几乎都能看到游戏外挂的身影,在FPS游戏中,可见变态功能层出不穷,例如加速,锁血 遁地,飞天,路飞,无后座,范围伤害等…,然而在MOBA游戏中,最常见的只有透视和自瞄。 切入正题,如何操作内存?在安卓中,我们可直接操作/proc/${pid}/mem 使用C语言pread函数 ssize_t pread(int fd, void *buf, size_t count, off_t offset); 简单解释下这个函数
PLCopen运动控制避坑指南:单轴功能块常见报错排查(基于SM3_Basic函数库)
本文深入解析PLCopen运动控制中单轴功能块的常见报错问题,基于SM3_Basic函数库提供实用排查指南。从功能块逻辑错误与硬件报错的甄别技巧到高频报错场景的解决方案,帮助工程师快速定位并解决运动控制系统中的稳定性问题,提升工业自动化设备的运行效率。
存内计算路线再获加持,清华存内芯片登Science
通过这种方法,可以比较有效的控制二氧化铪忆阻层中的微观变化,以及内部的温度和电场,使得器件具有非常优异的电学特性,而且可以在工厂里大规模生产,推动了高性能忆阻器阵列的诞生。团队搭建了全硬件构成的完整存算一体系统,如下图7所示,在系统里集成了多个忆阻器阵列,并在该系统上高效运行了卷积神经网络算法,成功验证了图像识别功能,证明了存算一体架构全硬件实现的可行性,并且成功实现了以更小的功耗和更低的硬件成本完成复杂的计算[6]。根据测试,在一般神经网络中权重更新的最后阶段,调整步长非常接近0,如图9(C)所示,
RDMA(远程直接内存访问)技术浅析
远程直接内存访问(即Remote Direct Memory Access)是一种直接内存访问技术,它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。
基于ResNet-50的猫狗分类训练
基于ResNet-50的猫狗分类python训练
远程注入手段 及 内存操作
有两个函数可以用来实现上述功能:VirtualAllocEx和CreateRemoteThread。这两个函数都只能在Windows NT下使用。 VirtualAllocEx函数可以用来在其他进程的地址空间内申请内存,当然申请到的内存也是位于目标进程的地址空间内的,将这个函数和WriteProcessMemory函数配合就可以在目标进程的地址空间中“造”出任何东西来。 VirtualAl
精通 Android NDK/JNI:从入门到精通实战与面试精粹
在Android开发中,
【WRF湿度调整策略】WRF/ERA5湿度数据对比
【WRF湿度调整策略】WRF/ERA5湿度数据对比
Rust 实战练习 - 8. 内存,ASM,外挂 【重磅】
目标: - C写一个Demo版本的游戏 - 由浅入深,了解外挂原理 - Linux/Android下实现内存读取 - ptrace实现内存修改(依赖第三方 ptrace 提供了一种机制使得父进程可以观察和控制子进程的执行过程,ptrace 还可以检查和修改子进程的可执行文件在内存中的image及子进程所使用的寄存器中的值。在Linux下如何搜索内存找到我们需要的数据,不在这里讨论,我们根据gamebox提供的地址,直接定位。这也就是简单的游戏外挂范围的技术。/c 就可以随机改变其中的等级,金钱,位置信息。
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
__asm__ __volatile__("": : :"memory")
__asm__ __volatile__("": : :"memory");内存屏障(memory barrier) #define set_mb(var, value) do { var = value; mb(); } while (0) #define mb() __asm__ __volatile__ ("" : : : "memory") 1)set_mb(),mb(),
efm32 入门.pdf
本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
编写远程监控机器的内存的插件
最近在公司一直做监控。发现有不少被监控服务器没有安装SNMP,也不允许安装NRPE插件。但是给予了SSH登陆权限。因此通过执行远程命令获取监控的内存变化,是个好办法. 第一步安装EXPECT,编写EXPECT脚本,用来模拟SSH登录,执行远程命令。 #!/usr/bin/expect -f #Program: # the script check the Cisco switch'
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
从书签到系统:用Markdown与静态站点构建设计灵感库
信息架构是决定数据能否被长期有效利用的关键。当个人收藏的设计灵感数量增长到上千条时,仅靠浏览器书签和笔记工具已经无法满足高效检索的需求。以结构化文件作为内容核心,通过静态站点生成器将Markdown渲染为可浏览的网页,再借助Git实现版本控制和变更留痕,是一种既轻量又可持续的解决方案。这套模式把灵感管理拆解为获取、整理、检索、回顾四个环节,利用标签、分类和全文索引降低信息查找成本,让设计素材的积累真正服务于创作决策。无论是前端开发者还是设计师,都可以基于这套思路搭建自己的本地优先知识库,并灵活扩展到自动打标
gcc内嵌汇编简单介绍,以及 __asm__ volatile ("": : :"memory")中memory解释
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。 1、简单的内嵌汇编 例: __asm__ __volatile__("hlt");`` "__asm__"表示后面的代码为内嵌汇编,"asm"是"__asm_...
4730



被折叠的 条评论
为什么被折叠?



