首页
学习
活动
专区
圈层
工具
发布

为拯救童年回忆,开发者决定采用古法编程:用Flash高清重制了一款游戏

用汇编程序编写二进制文件 导出器将动画数据写入自定义二进制格式。它只是逐帧通过时间轴,并写出每一帧的所有更改。 我在这里想到了写入汇编列表而不是直接写入二进制文件,我很喜欢这一点。...没有 CPU 指令,只有数据,这让调试更容易,因为我可以查看汇编文件以查看生成的内容,而不是在十六进制编辑器中浏览字节。...一个简单的帧动作。 最后,我们使用了一些技巧,我的导出器从每一帧读取 ActionScript 并应用大量正则表达式以尝试将其转换为 C++。...在不透明黑色像素之上绘制的半覆盖白色像素不应是感知的 50% 灰色。这不是光的工作原理,也不是矢量光栅化的工作原理。...解决方法是老式的手工活:完整遍历游戏,然后手动将额外的帧添加到现在看起来太快的动画中。 至此,我们已对 Hapland 游戏进行了相当不错的 C++ 转换,肯定可以在现代计算机上运行至少再过一两年。

1.2K10

《一个操作系统的实现》笔记(1)--NASM汇编语法和环境搭建

Bochs虚拟机调试方法 也可以在输入b 0x7c00之后继续执行,这样当引导扇区执行到这里时,我们就可以单步调试了,使用dump_cpu可以查看CPU寄存器,x /64xb [addr]查看某个内存地址处的内容...---- NASM汇编指令简介 每种类型的CPU都能理解它们自己的机器语言。机器语言里的指令是以字节形式在内存中储存的数字。 NASM汇编器帮我们完成了由汇编程序到机器指令的转换。...我们需要在下面这种情况下, 考虑这两种格式的区别: 1. 当二进制数据在不同的电脑上传输时(不管来自文件还是网络)。 2....当二进制数据作为一个多字节整形写入到内存中然后当作单个单个字 节读出,反之亦然。 所有的内部的TCP/IP消息头都以big endian的格式来储存整形。(称为 网络字节续)....TCP/IP 库提供了可移植处理Endian格式问题的方法的C函数。例如:htonl() 函数把一个双字(或长整形)从主机格式转换成了网络格 式。ntohl()函数执行一个相反的交换。

4.7K52
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    汇编语言从入门到精通-1预备知识

    这里,我们称该翻译程序为汇编程序。 ? 图1.1 汇编语言指令到机器指令的示意图   从图中不难看出:汇编程序能把左边汇编语言源程序翻译成右边的机器指令序列。...4、调试的复杂性   在通常情况下,调试汇编语言程序要比调试高级语言程序困难,其主要原因有四:   1)、汇编语言指令涉及到机器资源的细节,在调试过程中,要清楚每个资源的变化情况;    2)、程序员在编写汇编语言程序时...这样,在调试过程中,除了要知道每条指令的执行功能,还要清楚它在整个解题过程中的作用;   3)、高级语言程序几乎不显式地使用“转移语句”,但汇编语言程序要用到大量的、各类转移指令,这些跳转指令大大地增加了调试程序的难度...如果在汇编语言程序中也强调不使用“转移指令”,那么,汇编语言程序就会变成功能单调的顺序程序,这显然是不现实的;   4)、调试工具落后,高级语言程序可以在源程序级进行符号跟踪,而汇编语言程序只能跟踪机器指令...当然,从ASCII码表中还可看出其它有用信息,还有扩展的ASCII码等知识,但这些内容对学习本课程的帮助不明显,故不再叙述。有兴趣的读者可参阅其它书籍。

    1.8K31

    CPU 指令 NOT R0 的意义与实现详解

    它的核心含义是将 R0 寄存器中每一位的值从 0 转变为 1,或从 1 转变为 0。例如,如果寄存器 R0 的值是二进制的 00001111,执行 NOT R0 后,结果会变为 11110000。...例如,当输入信号是高电平(逻辑 1)时,输出信号为低电平(逻辑 0),反之亦然。4. 指令执行流程取指令(Fetch): 从内存中读取指令 NOT R0。...三、NOT 指令的应用场景NOT 操作在实际编程和硬件设计中具有广泛的应用,包括以下几个方面:1. 数据反转在某些场景中,NOT 操作可以用来快速反转数据的二进制表示。...四、示例代码及运行分析为了更好地理解 NOT R0 的工作原理,我们可以用一段汇编代码以及 C 语言实现来模拟其行为。...六、总结NOT R0 指令通过简单的按位取反操作,为计算机提供了强大的逻辑运算能力。从硬件的反相器实现到软件中的逻辑处理,它既是基本的操作,又是复杂功能的基石。

    39100

    9个基本的GNU binutils 工具【Linux-Command-line】

    汇编101 在深入研究binutils软件包本身之前,最好先了解编译的基础知识。 编译是将程序从某种编程语言(C / C ++)的源代码或文本形式转换为机器代码的过程。...objdump:显示目标文件中的信息 可以从二进制文件中转出机器语言指令的另一个binutils工具称为“objdump”。 使用“-d”选项,该选项可从二进制文件中反汇编所有汇编指令。...该存储位置的内容中还有什么?是的,你猜对了:它只不过是文本“Hello,World”。你如何确定? 使用readelf命令可以将二进制文件(a.out)的任何部分转储到屏幕上。...以下操作要求它将.rodata(只读数据)转储到屏幕上: 屏幕快照 2019-11-20 下午12.58.17.png 你可以在右侧看到文本“ Hello World”,在左侧看到其二进制地址。...屏幕快照 2019-11-20 下午1.16.13.png 现在,在你的可执行文件上运行strip命令,并使用file命令确保它可以正常工作: 屏幕快照 2019-11-20 下午1.20.07.png

    4.8K50

    汇编语言入门

    但并非要掌握计算机系统的全部硬件组成,只需掌握用汇编语言编制程序时所涉及到的那些硬件的结构和功能。 对一台计算机来说,机器语言的执行主要取决于该计算机的中央处理器CPU。...1.2 学习和使用汇编语言的目的(了解即可) 1.学习和使用汇编语言可以从根本上认识、理解计算机的工作过程。 更清楚地了解计算机是如何完成各种复杂的工作。...如十进制为10-1=9 在计算机中数据表示一般采用二进制数, 因为它在计算机中最容易表示和存储, 且适合于逻辑值的表达与运算。...例如,10B,10Q,10D,10H 二.各种数制的相互转换 1.十进制整数转二进制数 (1) 减权定位法 ·从二进制数高位起,依次用待转换的十进制数与各位权值进行比较; ·如够减,则该数位系数Ki...1.6 基本逻辑运算 计算机内部采用二进制数表示信息,具有物理实现容易、可靠性高的优点,且由于状态“0”和“1”正好与逻辑运算中的逻辑“真”和“假”对应,因此可以用“0”和“1”来表示逻辑变量的取值,很容易地实现各种复杂的逻辑运算

    84450

    Linux常见工具如yum、vim、gcc、gdb的基本使用,以及编译过程和动静态链接的区别

    ,反之亦然,需要命令模式做中介。...,若无-o则默认生成a.out gcc选项 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 -S 编译到汇编语言不进行汇编和链接 -c 编译到目标代码 -o 文件输出到 文件...编译过程 从源文件到可执行文件经过了如下几个步骤: ①预处理:头文件展开,宏定义替换,去注释,条件编译; ②编译:将源文件编译为汇编语言; ③汇编:将②中汇编语言进一步翻译为二进制机器语言; 此时的二进制文件可以被机器执行吗...答:不能,在我们的代码中只有函数的调用,如pringf、scanf等,没有他们的实现!!他们的实现在C标准库,还需要第五步链接! ④链接:将③中的二进制代码与库中代码合并链接最后形成可执行程序。...,但调试的思路一定是一样的。

    47110

    看懂编译原理:前端&后端编译器做了什么?

    :保存程序中全局的变量和常量这些数据的地址在编译期就可以确定,生存期从程序开始到程序结束堆:存放生存期较长的数据,比如方法里面创建后返回的对象栈(高地址向低地址延伸):存放生存期短的数据,比如函数和方法里面的本地变量环境变量内核空间栈的结构先是存储返回值...关于参数传递在汇编码中的实现方式默认情况下 参数传递是通过寄存器来传递,x86-64架构规定 六个以内的参数传递都是通过寄存器,超过六个用栈来传递(超过的参数在栈中倒序存放,先入站参数8,再入站7这样)...)******后端工作流后端编译器转换ast为汇编:识别ast语义信息(此处上下文信息越多,后面生成的汇编码效率越高,不需要额外推断)进行标签类型匹配,然后根据ast中对应语义信息携带的上下文生成汇编码...编译器后端将高级语言转换成汇编代码,汇编器将汇编代码转换成二进制目标文件,链接器将汇编代码和二进制目标文件链接绑定到汇编代码中典型的基于AST优化范例方法内部使用寄存器优化:识别方法参数转换为寄存器存储...)因此汇编器在编译汇编码到二进制文件时,得等到所有模块都编译完再*通过链接器链接模块中使用的具体的外部函数地址。

    1.2K31

    人人都能读懂的编译器原理

    因为从复杂的、人类可读的代码直接转化成0/1二进制会很复杂,所以编译器在产生可运行程序之前有多个步骤: 从你给定的源代码中读取单个词。 把这些词按照单词、数字、符号、运算符进行分类。...通过模式匹配从分好类的单词中找出运算符,明确这些运算符想进行的运算,然后产生一个运算符的树(表达式树)。 最后一步遍历表达式树中的所有运算符,产生相应的二进制数据。...尽管我说编译器直接从表达式树转换到二进制,但实际上它会产生汇编代码,之后汇编代码会被汇编/编译到二进制数据。汇编程序就好比是一种高级的、人类可读的二进制。 解释器是什么?...我找不到比我的 C 编译器后端更好的代码生成器示例了。 在生成汇编代码之后,这些汇编代码会被写入到一个新的汇编文件中 (.s 或 .asm)。...然后该文件会被传递给汇编器,汇编器是汇编语言的编译器,它会生成相应的二进制代码。之后这些二进制代码会被写入到一个新的目标文件中 (.o) 。 目标文件是机器码,但是它们并不可以被执行。

    1.9K11

    1.1 熟悉x64dbg调试器

    显示程序的汇编指令:反汇编窗口可以将二进制文件转换为汇编代码,并显示在窗口中。...这使得程序员可以深入了解程序的内部工作原理,并且可以查找程序中的漏洞和安全问题。 允许用户修改指令:反汇编窗口不仅可以显示程序的汇编指令,还可以允许用户直接在窗口中修改指令。...这对于调试和修复程序中的错误非常有用,但需要小心操作,以避免引入新的错误。 跟踪代码执行:反汇编窗口还可以跟踪被调试程序的代码执行过程,以便程序员可以了解程序在运行时的行为和状态。...在x64dbg中,调试这可以通过F2快捷键在所需下断点的位置下断,当该位置被下断点后,则调试器会以红色标注,而当前EIP指针则会使灰色显示,如下图所示; 此外软件断点同样可以使用bp/bpx等命令下断...在x64dbg中,硬件执行断点可以通过在指令前面的地址上设置“e”来实现。 硬件读取断点 - 当程序尝试从指定内存地址读取数据时,触发硬件读取断点。

    2K30

    1.1 熟悉x64dbg调试器

    :反汇编窗口可以将二进制文件转换为汇编代码,并显示在窗口中。...这使得程序员可以深入了解程序的内部工作原理,并且可以查找程序中的漏洞和安全问题。允许用户修改指令:反汇编窗口不仅可以显示程序的汇编指令,还可以允许用户直接在窗口中修改指令。...这对于调试和修复程序中的错误非常有用,但需要小心操作,以避免引入新的错误。跟踪代码执行:反汇编窗口还可以跟踪被调试程序的代码执行过程,以便程序员可以了解程序在运行时的行为和状态。...在x64dbg中,调试这可以通过F2快捷键在所需下断点的位置下断,当该位置被下断点后,则调试器会以红色标注,而当前EIP指针则会使灰色显示,如下图所示;图片此外软件断点同样可以使用bp/bpx等命令下断...在x64dbg中,硬件执行断点可以通过在指令前面的地址上设置“e”来实现。硬件读取断点 - 当程序尝试从指定内存地址读取数据时,触发硬件读取断点。

    1.8K20

    从源码到可执行文件:彻底搞懂 C 语言的编译与链接全过程

    翻译环境全景图 中。它为整篇文章定下了基调,解释了代码是如何从文本变成可运行程序的宏观流程。...您可以直接使用下面的文字作为这张图片的图注或者紧跟图片后的正文描述: 在 ANSI C 标准的定义中,程序的生命周期被清晰地划分为两个完全独立的世界(如图所示): 翻译环境 (Translation...如果我们把镜头拉近,编译又可以细分为三个原子步骤:预处理、编译、汇编。每个阶段都有其特定的任务和目标。这些阶段确保了源代码被转换成高效且可执行的形式,同时也负责检查错误并支持程序的模块化。...第二阶段:编译 (Compilation) —— 从代码到汇编 这是编译器的核心大脑。它将预处理后的文本文件,翻译成汇编代码。...终止:正常结束(return 0)或异常崩溃。 5. 总结与扩展 编译和链接并非黑魔法,而是极其严谨的数据转换过程: 预处理:文本操作,宏展开。 编译:将 C 语言翻译为汇编,构建语法树。

    69910

    编程知识科普--(2)什么是计算机编程中的低级语言和高级语言

    我们常常听到高级语言,低级语言等等,但是只是一知半解,比如Java和C等等是高级语言,而汇编是低级语言,那么他们之间的区别是什么呢,我从网上总结了一些观点,有助于大家的理解,有不足和错误之处可以在公众号里留言...从这个意义上来说,通过交叉汇编,一些汇编程序也可以获得不同机器之间的可移植性,但这种途径获得的移植性远远不如高级语言来的方便和实用性大。...也就是说你用高级语言写一句,会被转换成许多底层操作,大部分的工作交给了负责转换的机器(即编译器),从而人力得到了解放。因为机器就是用来为人类提供便利的,所以说高级语言的出现是计算机发展的必然结果。...而高级语言由于进行了抽象和封装,所以与机器指令间的耦合度较低,因此整个翻译过程较复杂,因此在高级语言在具体化的过程中不可避免会产生较多的冗余。据说C语言有10%的效率损失。...一个差的程序员用汇编写程序,可能存在很多没有用的操作,而程序高手用c语言写,可以将程序优化到最大。最终的结果可能是汇编的程序跑不过C语言程序。

    2.9K40

    新手经常忽略的嵌入式基础知识点,你都掌握了吗?

    可以指示CPU 执行以下典型的操作: ◎ 将数据从存储位置 220 复制到寄存器 3; ◎ 将寄存器 3 与寄存器 1 中的数字相加。...原因很简单,因为它们的CPU 体系结构不同。 x86 体系结构如今已成为行业标准,因此相同的代码可以在大部分个人计算机中执行。但考虑到节电的要求,手机采用的CPU 体系结构有所不同。...这个重要概念在于,无论简单与否,如果程序能采用编程语言进行编码,就可以重写后在任何图灵完备的机器中运行。编译器是一种神奇的程序,能自动将代码从复杂的语言转换为简单的语言。...反汇编与逆向工程 给定一个已编译的计算机程序,无法在编译之前恢复其源代码。但我们可以对二进制程序解码,将用于编码CPU 指令的数字转换为人类可读的指令序列。这个过程称为反汇编。...为将复杂的计算命令转换为CPU 可以执行的简单指令,需要使用一种称为编译器的程序。计算机之所以能进行复杂计算,仅仅是因为CPU 可以执行大量基本操作。 计算机的处理器速度很快,但存储器相对较慢。

    82820

    1.1 熟悉x64dbg调试器

    显示程序的汇编指令:反汇编窗口可以将二进制文件转换为汇编代码,并显示在窗口中。...这使得程序员可以深入了解程序的内部工作原理,并且可以查找程序中的漏洞和安全问题。 允许用户修改指令:反汇编窗口不仅可以显示程序的汇编指令,还可以允许用户直接在窗口中修改指令。...这对于调试和修复程序中的错误非常有用,但需要小心操作,以避免引入新的错误。 跟踪代码执行:反汇编窗口还可以跟踪被调试程序的代码执行过程,以便程序员可以了解程序在运行时的行为和状态。...在x64dbg中,调试这可以通过F2快捷键在所需下断点的位置下断,当该位置被下断点后,则调试器会以红色标注,而当前EIP指针则会使灰色显示,如下图所示; 此外软件断点同样可以使用bp/bpx等命令下断,...在x64dbg中,硬件执行断点可以通过在指令前面的地址上设置“e”来实现。 硬件读取断点 - 当程序尝试从指定内存地址读取数据时,触发硬件读取断点。

    4.3K10

    1.1 熟悉x64dbg调试器

    :反汇编窗口可以将二进制文件转换为汇编代码,并显示在窗口中。...这使得程序员可以深入了解程序的内部工作原理,并且可以查找程序中的漏洞和安全问题。允许用户修改指令:反汇编窗口不仅可以显示程序的汇编指令,还可以允许用户直接在窗口中修改指令。...这对于调试和修复程序中的错误非常有用,但需要小心操作,以避免引入新的错误。跟踪代码执行:反汇编窗口还可以跟踪被调试程序的代码执行过程,以便程序员可以了解程序在运行时的行为和状态。...在x64dbg中,调试这可以通过F2快捷键在所需下断点的位置下断,当该位置被下断点后,则调试器会以红色标注,而当前EIP指针则会使灰色显示,如下图所示;图片此外软件断点同样可以使用bp/bpx等命令下断...在x64dbg中,硬件执行断点可以通过在指令前面的地址上设置“e”来实现。硬件读取断点 - 当程序尝试从指定内存地址读取数据时,触发硬件读取断点。

    1.6K30

    【计算机组成原理】计算机系统的层次结构——计算机软件

    在计算机眼中,越是高级的语言,就越难被计算机给识别,因此,为了保证由各种语言编译的程序能够在计算机中正常运行,所有的程序都需要通过一定的方式将其转换成机器语言程序。...关于计算机系统的层次分层方式,目前尚无统一的标准,这里我们介绍如下图所示的层次结构: 在该多级层次结构中,微程序机器层为第一级,而高级语言层则为第五级。那从第一级到第五级分别代表什么意思呢?...,因此高级语言层的下一级则是汇编语言层,在由高级语言编写的程序中难免会涉及到一些系统调用的指令,因此在汇编语言层的下一级则是操作系统层。...在虚拟机器中,观察者只能通过该层的语言来了解与使用计算机,而不必关心下一层是如何工作的,也就是说,对于高级语言层的使用者来说,他们能够直观的感受到的是计算机是能够识别他们所编写的高级语言程序的,但是他们并不会关心计算机从汇编到机器语言的整个识别过程...今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《计算机系统的工作原理》的相关内容,大家记得关注哦!

    1.2K10

    【重生之我在学习C语言编译与链接详解】

    宏替换:将#define定义的宏替换为其定义的值。 文件包含:将#include包含的头文件内容插入到源代码中。这个过程是递归进行的,即被包含的头文件也可能包含其他文件。...中,可以使用以下命令进行预处理: gcc -E example.c -o example.i 三、编译阶段(Compilation) 编译阶段的任务是将预处理后的C代码转换为汇编代码。...ret 在GCC中,可以使用以下命令进行编译: gcc -S example.i -o example.s 四、汇编阶段(Assembly) 汇编阶段的任务是将汇编代码转换为机器码(二进制代码)。...汇编器会将汇编代码文件转换为目标 文件(通常扩展名为.o或.obj),该文件包含了机器语言指令,但尚未链接完整。...在 GCC中,可以使用以下命令进行汇编: gcc -c example.s -o example.o 五、链接阶段(Linking) 链接阶段的任务是将一个或多个目标文件以及所需的库文件链接在一起,生成一个可执行文件

    22400

    【Linux】Linux编译器gccg++的使用

    -DSHOW //标识符在命令行中定义 从下面图片便可以看出预处理阶段进行的4个步骤,删除注释,拷贝头文件,条件编译,宏替换 头文件最大的意义:1.写代码 2.支持代码自动补齐 2.编译(C语言...==> 汇编语言) -S进行程序的编译工作,做完编译工作,变成汇编语言之后,就停下来!...gcc -S test.i -o test.s 3.汇编(无法被执行的二进制文件,为什么捏?) -c进行程序的汇编工作,做完汇编工作,变成可重定向目标二进制文件,就停下来!...,链接阶段会帮助我们将标准库动态链接到我们的程序里面,之后程序才可以正常的运行。...系统还给我们提供了动静态标准库.so/.a,这里面有方法的实现,也就是一些已经写好的二进制代码,但我们需要将我们的代码和库代码进行链接,才可以正常使用。

    2.8K11

    CPU是如何运行程序的

    ❝CPU 只能识别二进制的指令 ❞ 汇编语言 但是,二进制代码难以阅读和记忆,又将二进制指令集转换为人类可以识别和记忆的符号 -- 「汇编指令集」 1000100111011000 机器指令 mov...,原本是二进制表示的指令,在汇编代码中可以使用单词来表示。...「汇编语言和机器语言是一一对应的」 编译后的程序是由一堆二进制代码组成的(二进制代码是由一条条指令构成的) 准备工作 在程序执行之前,程序需要被「装进内存」。...CPU 可以通过指定内存地址,从内存中读取数据,或者往内存中写入数据。(内存是一个临时存储数据的设备, 因为断电之后,内存中的数据都会消失) 「内存中的每个存储空间都有其对应的独一无二的地址」。...当二进制代码被装载进了内存之后, 系统会将二进制代码中的第一条指令的地址写入到 PC 寄存器中。 到了下一个时钟周期时,CPU 便会根据 PC 寄存器中的地址,从内存中取出指令。

    1.9K20
    领券