Questions tagged «assembly»

汇编语言是用于计算机,微控制器或其他可编程设备的低级编程语言,其中每个语句对应于一条机器代码指令。

17
学习汇编对编程有何帮助?[关闭]
我使用高级语言(Python,C#,VBA,VB.NET)编程已有大约10年的时间,而对于“幕后”所发生的事情,我完全不了解。 我想知道学习汇编的好处是什么,对作为程序员的我有什么帮助?您能否提供给我一个资源,向我展示我在高级代码中编写的代码与汇编中发生的代码之间的确切联系?
132 assembly 

7
这是汇编语言吗?
在我的童年时代,我曾使用MK-61 苏联计算器编程。它具有四个操作寄存器(X,Y,Z,T)和15个存储寄存器。一个程序可以有105个步骤。 我记得它有以下命令: 交换X和Y寄存器 移位寄存器(Z到T,Y到Z,X到Y) 从存储寄存器(1..15)复制到X 从X复制到存储寄存器(1..15) 如果X <0,则转到程序步骤## 使用X和Y值执行运算(+,-,*,/)并将结果放入X 该命令设置了汇编语言吗?使用此设备是否对汇编语言有基本了解? 事实证明,这就是所谓的“按键编程”。 有趣的事实:1988年,类似的计算器(像这样的计算器,但具有与能量无关的内存)被用作太空任务轨迹计算的备用硬件。:-)

9
第一批编译器是如何制作的?
我总是对此感到疑惑,也许我需要一门关于编程语言的良好历史课程。但是,由于当今大多数编译器都是用C编写的,那么最早的编译器是如何编写的(在C之前是AKA),或者是所有语言都只是被解释了? 话虽这么说,我还是什至不了解第一种汇编语言是如何完成的,我理解什么是汇编语言,但是我看不到他们如何使非常第一的汇编语言起作用(例如,他们是如何使第一命令(如mov R21)或w / e设置为等效的二进制代码?

12
计算机如何工作?[关闭]
这真是令人尴尬的问题...我拥有计算机科学学位(第二个学位正在进行中)。我已经担任全职.NET开发人员近五年了。一般来说,我似乎能胜任我的工作。 但是我不知道计算机如何工作! 拜托,让我呆一秒钟。快速搜索“计算机的工作原理”会产生很多结果,但是我很难找到一个真正能够满足我所寻找内容的工具。我意识到这是一个巨大,巨大的问题,因此,如果您能给我一些关键词或一些指导,那么我是真的。 我知道有组件...电源,主板,内存,CPU等...,我对它们的工作有一个“总体思路”。但是我真的不明白您如何从Console.Readline().NET(或Java或C ++)这样的代码行中真正地完成工作。 当然,我隐约意识到MSIL(对于.NET),并且JIT编译器发生了一些魔术,它变成了本机代码(我认为)。有人告诉我Java很相似,而C ++削减了中间步骤。 我已经完成了一些大型机的组装,这是几年前的事了。我记得有一些指令和一些CPU寄存器,我写了代码。。。然后发生了一些魔术。。。我的程序可以运行(或崩溃)。据我了解,“仿真器”将模拟您调用指令时发生的情况,并会更新CPU寄存器。但是,是什么使这些指令以它们的方式起作用? 这会变成电子问题而不是“计算机”问题吗?我想我没有任何实际的理由来理解这一点,但是我觉得我应该能够。 (是的,这就是当您带一个小孩花一天时间时发生的事情。花了他们大约10分钟的时间和五次反复的问“为什么?”,您才意识到自己不知道多少)

4
用于Apollo 11任务代码的开发过程?
阿波罗任务的技术并不比袖珍计算器复杂。 在这里的链接中,有有关阿波罗制导计算机(AGC)的信息 机载阿波罗制导计算机(AGC)约为1立方英尺,带有2K的16位RAM和36K的硬线芯绳存储器,铜线穿过或不穿过微小的磁芯。16位字通常是14位数据(或两个操作码),1个符号位和1个奇偶校验位。循环时间为11.7微秒。用反向波兰语用汇编语言和解释性语言进行编程。 因此,当我研究那里的内容时,偶然发现了一些源代码,并且注意到了很多注释(例如,临时,我希望实现希望) VRTSTART TS WCHVERT # Page 801 CAF TWO # WCHPHASE = 2 ---> VERTICAL: P65,P66,P67 TS WCHPHOLD TS WCHPHASE TC BANKCALL # TEMPORARY, I HOPE HOPE HOPE CADR STOPRATE # TEMPORARY, I HOPE HOPE HOPE TC DOWNFLAG # PERMIT X-AXIS OVERRIDE ADRES XOVINFLG TC DOWNFLAG ADRES …

3
为什么我们仍然向后增加堆栈?
编译C代码并查看汇编时,所有的堆栈都像这样向后生长: _main: pushq %rbp movl $5, -4(%rbp) popq %rbp ret -4(%rbp)-这是否意味着基本指针或堆栈指针实际上是向下移动内存地址而不是向上移动?这是为什么? 我换$5, -4(%rbp)到$5, +4(%rbp),编译和运行代码并没有任何错误。那么,为什么我们还必须在内存堆栈上倒退呢?
46 c  memory  assembly 

5
这怎么能容纳64kb?
因此,我在2011年大会上就在这里进行了演示:http : //www.youtube.com/watch?v= 69Xjc7eklxE&feature= player_embedded 它只是一个文件,在规则中说明了这一点。所以我重复一遍,他们如何使它适合如此小的文件?
45 assembly 

15
语言如何影响CPU设计?[关闭]
人们经常被告知,硬件并不在乎用哪种语言编写程序,因为它只能看到编译后的二进制代码,但这并不是全部。例如,考虑一下不起眼的Z80;它对8080指令集的扩展包括CPIR之类的指令,可用于扫描C样式(以NULL结尾的)字符串,例如执行strlen()。设计人员必须已经确定,运行C程序(与Pascal相反,在Pascal中,字符串的长度位于标头中)是他们的设计可能会使用的东西。另一个经典的例子是Lisp Machine。 还有什么其他例子?例如,使特定处理器偏爱特定语言约定的指令,寄存器的数量和类型,寻址模式?我对同一家庭的修订特别感兴趣。

10
是第一个用机器代码编写的汇编程序吗?
我正在阅读《计算系统的元素:从第一原理构建现代计算机》一书,其中包含的项目涉及从布尔门到高级应用程序(按此顺序)的计算机构建。我正在处理的当前项目是使用我选择的高级语言编写汇编程序,以将Hack汇编代码转换为Hack机器代码(Hack是前几章中构建的硬件平台的名称)。尽管所有硬件都是在模拟器中构建的,但我试图假装我实际上在实际过程中仅使用当时可用的工具来构建每个级别。 就是说,这让我开始思考。使用高级语言编写我的汇编程序当然很方便,但是对于有史以来第一个(即历史上)编写的汇编程序,它不需要用机器代码编写,因为那时已经存在了? 还有一个相关的问题...今天怎么样?如果出现了全新的CPU体系结构,全新的指令集和全新的汇编语法,则如何构造汇编器?我假设您仍然可以使用现有的高级语言来为汇编程序生成二进制文件,因为如果您知道新平台的汇编语言和机器语言的语法,那么编写汇编程序的任务实际上就是文本分析任务,并且与该平台没有内在联系(即需要以该平台的机器语言编写)...这就是我能够在2012年编写我的Hack汇编程序时“作弊”并使用一些预先存在的原因的原因高级语言可以帮助我。

11
高水平的开发人员花时间研究组装是否明智?[关闭]
显然,对低水平知识的了解在我们的工作中非常重要。 但是,如果您已经在高水平上开发商业软件,并且已经选择了方向但没有任何汇编技能,那么专注于研究与您的方向相关的内容是否更合理?还是有理由要花一些时间来学习低级基础知识? 什么时候为时已晚,什么时候不为时?而如果它是不是太晚了,那么如何将一个去学习最佳(在不花费过多的时间来得到一些深入和理解的意义上)?

13
低级编程-对我有什么用?[关闭]
多年以来,我一直在考虑深入研究“低级”语言。对我来说,这意味着C语言和汇编语言。但是,我还没有时间这样做,也从来没有必要。 现在,因为我看不到任何必要,所以我觉得我应该只是安排某个时间点来学习该主题,或者永远放弃该计划。 我的位置 在过去的四年中,我一直专注于可能会发生变化的“ Web技术”,而我是一名应用程序开发人员,这不太可能发生变化。 在应用程序开发中,我认为可用性是最重要的。您编写的应用程序将被用户“消耗”。这些应用程序越有用,您产生的价值就越大。 为了获得良好的可用性,我相信以下是可行的 良好的设计:经过深思熟虑的功能可通过深思熟虑的用户界面访问。 正确性:如果实施不正确,那么最好的设计一文不值。 灵活性:应用程序A应该不断发展,以便其用户不必切换到具有A可以实现的具有新功能的其他应用程序B。解决同一问题的应用程序的功能不应有所不同,而应在原理上有所不同。 性能:性能有助于获得良好的用户体验。理想情况下,应用程序始终具有响应能力,并且可以相当快地执行其任务(基于其频率)。性能优化的价值超出了用户可察觉的范围,这值得怀疑。 我认为除了性能之外,低级编程不会对我有所帮助。但是,出于性能考虑,以低级语言编写整个应用程序对我来说还为时过早。 我的问题 低级编程可以教给我什么,其他语言不能教给我什么?我是否缺少某些东西,或者仅仅是一项技能,而这对于应用程序开发几乎没有用?请理解,我不是在质疑C和汇编的价值。只是,在我的日常生活中,我非常高兴地了解到这个世界的所有错综复杂的东西并为我进行了管理(主要是通过用C / C ++编写的层以及自己进行汇编)。我只是看不到任何新概念,对我而言只是细节。那对我有什么用呢? 我的结论 感谢大家的回答。我必须说,没有人真的让我感到惊讶,但是至少现在我可以肯定,我会放弃对此感兴趣的领域,直到需要它为止。 据我了解,如今为当今的CPU中使用的处理器编写程序集不仅不必要地复杂,而且有可能导致运行时性能比C语言差。由于OOE的原因,手工优化几乎是不可能的,尽管您没有获得编译器可以自动进行的各种优化。而且,该代码是可移植的,因为它使用了一小部分可用命令,或者经过了优化,但可能仅在一种体系结构上工作。 编写C不再像以前那样需要。如果要用C编写应用程序,我将尽可能使用经过测试和建立的库和框架,这将使我免于实现字符串复制例程,排序算法和其他在大学中用作练习的东西。我自己的代码将以类型安全为代价更快地执行。我既不希望在常规应用程序开发过程中重新发明轮子,也不希望通过查看核心转储来进行调试:D 我目前正在尝试语言和解释器,所以我想发布什么内容,我想尽管C ++也可以做到这一点,但可以将一个可行的概念移植到C上。 再次感谢大家的回答和见解。

1
帧指针说明
在MIPS程序集中,有一个寄存器用于堆栈指针,另一个寄存器用于帧指针。什么是帧指针,其目的是什么?它与堆栈指针有何不同?
28 assembly  stack 

5
是否有关于x86汇编的经典书籍?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 有很多关于汇编的书。但是,它们通常处理我不关心的ISA,例如MIPS或ARM。我不处理这些架构;我没有理由尝试学习它们。 但是x86汇编书籍似乎...不存在。 假设例如,我正在尝试构建一个玩具编译器,以生成Windows Portable可执行文件。 是否有一本书是事实上的标准,用于描述有关x86组装的最佳实践,设计方法和其他有用信息?那本书使它与众不同吗?
25 learning  books  assembly  x86 

3
为什么复制指令通常命名为MOV?
在许多汇编器中,值复制指令通常称为“ MOV”,其说明中通常也包含“ move”(但是,可以使用其他词,如“ load”,“ store”,“ extract”等。 )找到不遵循此约定的ISA并不常见。 另一方面,在其他情况下,“ move”与“ copy”在破坏源的意义上有所不同(例如,Unix中的“ mv”与“ cp”,Norton Commander中的 Move [F6] 和克隆等)。 )汇编程序的“移动”确实具有语义上的“复制”,从而保持了源值的完整性。 我发现这至少是从IBM 1401(1959)开始的,但是IBM 360仅将此词用于存储内复制,而不用于寄存器和存储(使用“ load”和“ store”)之间的操作。 。但是,为什么它仍然被广泛使用,而不是被“复制”或“存储”取代?
23 history  assembly 

3
我想构建一个虚拟机,有什么好的参考资料吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我希望将虚拟机构建为平台独立的方式来运行一些游戏代码(基本上是脚本)。 我在游戏中意识到的虚拟机已经很老了:Infocom的Z-Machine,LucasArts的SCUMM,id Software的Quake 3。作为.net开发人员,我熟悉CLR,并研究了CIL指令以概述您在VM级别(与语言级别)上实际实现的内容。去年,我还涉猎了6502 Assembler。 问题是,既然我想要¹实施它,我就需要更深入地研究。我知道有基于堆栈和基于注册的虚拟机,但我真的不知道哪种虚拟机在什么方面更好,以及是否有更多或混合的方法。我需要处理内存管理,确定哪些低级类型是VM的一部分,并且需要了解ldstr之类的东西为何以这种方式工作。 我唯一的参考书(除了Z-Machine之外)是CLI注释标准,但是我想知道是否有针对VM的更好,更通用/更基础的讲座?基本上像《龙书》,但适用于虚拟机?我知道Donald Knuth的计算机编程艺术,它使用基于寄存器的VM,但是我不确定该系列的适用性如何,尤其是因为它尚未完成? 澄清:目标是构建专用的VM。例如,Infocom的Z机包含用于设置背景颜色或播放声音的操作码。因此,我需要确定进入VM的OpCodes数量与使用脚本(语言TBD)并从中生成字节码的编译器的数量有关,但是为此,我需要了解自己的实际工作。 ¹我知道,现代技术将使我能够即时解释高级脚本语言。但是那有什么乐趣呢?:)谷歌搜索也有点困难,因为如今虚拟机通常与VMWare型OS虚拟化相关联...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.