标签: machine-code

汇编代码与机器代码对象代码?

目标代码,机器代码和汇编代码之间有什么区别?

你能举出他们差异的视觉例子吗?

assembly machine-code object-code

215
推荐指数
6
解决办法
15万
查看次数

本机代码,机器代码和汇编代码之间有什么区别?

我对.NET语言环境中的机器代码和本机代码感到困惑.

他们之间有什么区别?它们是一样的吗?

.net assembly bytecode machine-code

96
推荐指数
4
解决办法
4万
查看次数

什么是"代表; nop;" 在x86汇编中意味着什么?它与"暂停"指令相同吗?

  • 什么rep; nop意思?
  • 它和pause指令一样吗?
  • 它是否与rep nop(没有分号)相同?
  • 这个简单的nop指令有什么区别?
  • 它在AMD和英特尔处理器上的表现是否不同?
  • (奖金)这些说明的官方文件在哪里?

这个问题的动机

另一个问题的评论中进行一些讨论后,我意识到我不知道rep; nop;x86(或x86-64)汇编中的含义.而且我也无法在网上找到一个好的解释.

我知道这rep是一个前缀,意味着"重复下一个指令cx时间"(或至少它是,在旧的16位x86汇编中).根据这一维基百科汇总表,似乎rep只能与使用movs,stos,cmps,lods,scas(但也许是对新的处理器去掉这个限制).因此,我认为rep nop(没有分号)将重复nop操作cx时间.

然而,经过进一步搜索,我更加困惑.它似乎rep; noppause 映射到完全相同的操作码,并且pause有一些不同的行为nop.2005年的一些旧邮件说不同的东西:

  • "尽量不要燃烧太多的力量"
  • "它只相当于'nop',仅使用2字节编码."
  • "这对英特尔来说是神奇的.它就像'nop但是让其他HT兄弟跑了'"
  • "这是暂停英特尔和Athlon的快速填充"

有了这些不同的意见,我无法理解正确的含义.

它正在Linux内核中使用(在i386x86_64上)以及此注释:/* REP …

cpu x86 assembly x86-64 machine-code

80
推荐指数
2
解决办法
2万
查看次数

int运算符!=和==比较为零

我发现!=和==不是测试零或非零的最快方法.

bool nonZero1 = integer != 0;
xor eax, eax
test ecx, ecx
setne al

bool nonZero2 = integer < 0 || integer > 0;
test ecx, ecx
setne al

bool zero1 = integer == 0;
xor eax, eax
test ecx, ecx
sete al

bool zero2 = !(integer < 0 || integer > 0);
test ecx, ecx
sete al
Run Code Online (Sandbox Code Playgroud)

编译器:VC++ 11优化标志:/ O2/GL/LTCG

这是x86-32的汇编输出.两个比较的第二个版本在x86-32和x86-64上都快了约12%.但是,在x86-64上,指令是相同的(第一个版本看起来与第二个版本完全相同),但第二个版本仍然更快.

  1. 为什么编译器不能在x86-32上生成更快的版本?
  2. 当汇编输出相同时,为什么第二个版本在x86-64上仍然更快?

编辑:我添加了基准测试代码.ZERO:1544ms,1358ms NON_ZERO:1544ms,1358ms http://pastebin.com/m7ZSUrcPhttp://anonymouse.org/cgi-bin/anon-www.cgi/http://pastebin.com/m7ZSUrcP

注意:在单个源文件中编译时找到这些函数可能不方便,因为main.asm非常大.我在一个单独的源文件中有zero1,zero2,nonZero1,nonZero2.

编辑2:安装了VC++ 11和VC++ 2010的人是否可以运行基准测试代码并发布时间?它可能确实是VC++ 11中的一个错误.

c++ performance assembly machine-code

75
推荐指数
2
解决办法
3002
查看次数

如何在没有EXE或ELF等容器的情况下手动编写和执行PURE机器代码?

我只需要一个hello world演示来查看机器代码实际上是如何工作的.

虽然windows的EXElinux'ELF接近机器代码,但它不是PURE

如何编写/执行PURE机器代码?

machine-code

49
推荐指数
6
解决办法
6万
查看次数

44
推荐指数
7
解决办法
1万
查看次数

如何手动编写和执行Windows .exe(使用Hex编辑器的机器代码)?

我想知道如何通过使用十六进制编辑器来编写像Hello World程序这样简单的东西是可能的.我知道我可以在近机器级别使用汇编语言和汇编语言,但我只想尝试在Hello World这样的玩具示例中编写机器代码.

这可能是一个简单的DOS .COM文件,我可以在DOSBox上运行.但是,如果有人可以提供.EXE文件的示例,直接在我的Windows PC上运行它会很好.

这只是纯粹的好奇心.不......我不打算直接用二进制机器代码编写程序(我甚至不编写汇编代码,我只是在大多数时候使用C/C++作为我最低级的工具).我只是想知道是否可以这样做,因为可能有人必须在计算机的早期阶段做到这一点.

PS:我知道关于这个话题有类似的问题,但没有提供一个有效的例子.我只想要一个简单的例子,以便它可以帮助我理解编译器和汇编器如何生成可执行文件.我的意思是......在过去的第一个项目中,有人必须亲手完成.此外,对于Windows EXE格式,Microsoft必须有人编写第一个生成格式的工具以及Windows本身读取它然后执行它的方式.

windows executable exe machine-code

37
推荐指数
4
解决办法
3万
查看次数

汇编语言和机器语言之间有什么关系?

汇编语言和机器语言(对于相同的底层系统)是否真的相同?这两个概念之间有什么不同吗?

architecture assembly operating-system machine-code isa

31
推荐指数
4
解决办法
8万
查看次数

如何计算跳转目标地址和分支目标地址?

我是汇编语言的新手.我正在阅读有关MIPS架构的内容,我遇到了跳转目标地址分支目标地址以及如何计算它们.

assembly mips machine-code

30
推荐指数
2
解决办法
9万
查看次数

同性恋和"不受限制"的自我修改代码+ lisp是否真的可以自我修改?

我将继续承认我对Lisp的了解非常少.但是我对这门语言非常感兴趣,并计划在不久的将来开始认真学习它.我对这些问题的理解无疑是有缺陷的,所以如果我说出任何错误的内容,请评论并纠正我而不是贬低.

真正的同性恋和自我修改的语言

我正在寻找支持Homoiconicity(代码与数据表示相同)和不受限制的自我修改的编程语言示例(Unrestricted意味着您可以更改正在运行的代码的每个方面,而不仅仅是发出新代码或更改函数指针/代表).

到目前为止我发现的三个例子符合这个标准:

  1. 机器代码.Homoiconic在一切都是一个数字.无限制地可修改,因为它包含指针,可用于操纵任何内存地址,无论该地址是保存代码还是数据.
  2. Malbolge.与机器代码相同的推理.每条指令在执行后都会自行修改
  3. 脱氧核糖核酸.不是编程语言,但仍然很有趣.它不是与机器代码一样的自我修改; 实际指令+数据在哪里修改到位.然而,它是自我复制的,并且可以根据它的先前状态进行变异/进化(具有副作用,例如辐射时不时地拧紧它).无论如何,这只是一种间接的自我修改方式.简而言之,DNA可以自我修饰,但它可以通过在相关突变中重现自身的真实性来实现.DNA的物理串是"不可变的".

为什么Lisp不在此列表中

Lisp不在那个列表中,因为在我看来,Lisp 几乎只是Homoiconic,并且只支持受限制的自我修改.你可以做点什么

(+ 1 2 3)
Run Code Online (Sandbox Code Playgroud)

这将做同样的事情

(eval '(+ 1 2 3))
Run Code Online (Sandbox Code Playgroud)

第一个版本(+ 1 2 3)是原始代码,而第二个版本是数据.通过假设这个陈述的真实性,可以说Lisp甚至不是杀人的.代码与数据具有相同的表示形式,即它们都是列表/树/ S表达式.但事实上你必须明确地标记这些列表/树/ S表达式中的哪些是代码以及哪些是我的数据似乎说Lisp毕竟不是杀人的.这些表示非常相似,但它们的细节不同,您必须实际说明您是在处理代码还是数据.这绝不是一件坏事(实际上其他任何东西都会是疯狂的),但它强调了Lisp和机器代码之间的区别.在机器代码中,您不必明确标记哪些数字是指令,哪些是指针,哪些是数据.在实际需要解释之前,一切都只是一个数字,此时它可以是任何一个.

对于不受限制的自我修改,这是一个更强大的案例.当然,您可以获取代表某些代码并对其进行操作的列表.例如改变

'(+ 1 2 3)
Run Code Online (Sandbox Code Playgroud)

'(+ 1 4 3)
Run Code Online (Sandbox Code Playgroud)

然后你运行它eval.但是当你这样做时,你只是编译一些代码并运行它.您没有修改现有代码,只是发出并运行新代码.C#可以使用表达式树完全相同的事情,即使是一种不太方便的格式(由于C#代码对其AST具有不同的表示而产生,而不是Lisp,这它自己的AST).您是否可以实际获取整个源文件并在运行时开始修改整个源文件,对源文件所做的更改会对程序行为产生实时影响?

除非有某种方法可以做到这一点,否则Lisp既不是讽刺也不是自我修改.(为了推断定义的争论,Lisp不是同源的,也不是自我修改到与机器代码相同的程度.)

如何制作Lisp Homoiconic/Unrestrictedly self-modifiable

我可以看到3种可能的方法使Lisp像机器代码一样可以单调/自我修改.

  1. 非Von-Neumann架构.如果有人能发明一些令人惊奇的假设机器,其中程序的最低级别表示是一个可以直接执行的AST(不需要进一步编译).在这样的机器上,AST将代表可执行指令以及数据.不幸的是,问题不会得到解决,因为AST仍然必须是代码或数据.eval函数的预设不会改变这一点.在机器代码中,您可以根据需要在代码和数据之间来回切换.而使用eval和Lisp,一旦你将某些列表从数据转换为代码并执行它,就无法再将该列表作为数据返回.实际上,该列表已经永远消失,并且已经被它的价值所取代.我们会遗漏一些至关重要的东西,这恰好是指针.
  2. 列出标签.如果要求每个列表也具有唯一标签,则可以通过针对具有给定标签的列表运行函数来进行间接自修改.结合延续,这最终将允许自动修改代码与机器代码具有相同的意义.标签与机器代码存储器地址等效.例如,考虑一个Lisp程序,其中AST的顶部节点具有标签"main".在main中,你可以执行一个函数,它接受一个标签,一个Integer,一个Atom,并将原子复制到List,其标签与提供给函数的标签相匹配,在Integer指定的索引处.然后在main上调用当前的continuation.你去,自我修改代码.
  3. Lisp Macros.我没有花时间去理解Lisp宏,他们实际上可能正是我正在考虑的事情.

点1.结合2.将产生一个完全自我修改的Lisp.前提是可以生产所描述的神奇的Lisp机器.2.单独可以产生自我修改的Lisp,但是在冯·诺依曼架构上的实现可能非常低效.

问题

  1. 机器码,dna和malbolge以外的任何语言都可以完全自我修改并且是同音的吗?
  2. (如果你做了tl,请不要打扰回答;上面的文字博士).lisp真的是homoiconic +自我修改吗?如果你这样说,你能准确引用我在论证中误入歧途的地方吗?

附录

语言具有不受限制的自我修改但不具有杀戮性

  1. 部件.代码使用单词而不是数字,因此失去了homiconicity,但它仍然有指针,它保留对内存的完全控制并允许不受限制的自我修改.
  2. 任何使用原始指针的语言.例如C/C++/Objective C.与Assembly相同的参数
  3. 包含虚拟指针的JIT语言.例如,C#/ .net在不安全的上下文中运行.与Assembly相同的论点.

其他概念和语言可能在某种程度上相关/有趣:Lisp,Ruby,Snobol,Forth和它的编译时元编程,Smalltalk和它的反射,无类型的lambda演算,它的属性是一切都是函数(哪种意味着假设我们可以发明一台直接执行lambda演算的机器,lambda演算将是homoiconic而Von Neumann机器代码在所述机器上运行时不会.[并且Godels定理将是可执行的.哈哈,可怕的想法:P])

lisp assembly machine-code self-modifying homoiconicity

29
推荐指数
2
解决办法
5237
查看次数