问题标签 [machine-code]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1880 浏览

assembly - x86 操作码编码中的方向/符号扩展位

在 x86 指令集中,操作码索引 1 处的位可以是指定目标和源操作数的方向位,也可以是符号扩展位。

例如对于add

  • 00 /r ADD r/m8, r802 /r ADD r8, r/m8
    该位区分r/m, regreg, r/m相同的助记符
  • 81 /0 id ADD r/m32, imm3283 /0 ib ADD r/m32, imm8
    完整(第 1 位清零)与符号扩展立即数(第 1 位设置)

我想知道确定其中哪种情况的最简单的逻辑方法是什么。除了检查指令操作码并比较它们以找出它是什么(对于指令的符号扩展或方向位变体)之外,还有其他方法可以检查吗?还有一些指令忽略该位,但由于它设置为 0,所以它并不重要。

编辑:事实证明,对于写错误(这是我的代码的目的), reg->r/m 总是如此,因为 ar/m->reg 指令永远不会触发写错误。但是,如果其他人遇到类似问题,任何信息仍然会很好。

0 投票
2 回答
9036 浏览

assembly - func 在 R-Format 指令集中是什么意思?

我对汇编语言很陌生。我正在阅读有关MIPS架构的信息,但我被Register Format (R-Format)的最后一个字段所困扰。这是它的视觉表示, 在此处输入图像描述 谁能帮我解释一下第六个字段是什么意思以及我们如何计算它?提前致谢。

0 投票
4 回答
117331 浏览

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

我是汇编语言的新手。我正在阅读有关MIPS架构的信息,但我被Jump Target AddressBranch Target Address以及如何计算它们困住了。

0 投票
1 回答
1385 浏览

assembly - push return values in stack frame

I'm wondering if it makes sense to push the return value of a function in its the stack-frame.

I know return values are mostly stored in registers (eax for gcc), but is it for performance only?

Thanks!

0 投票
4 回答
1146 浏览

compilation - 编程语言 X 中的一条语句生成多少行机器代码?

阅读一篇关于Lost Programming Skills的文章,作者提出了这个聊天:

我:你需要多少马力?
瑟:我不知道。
我:让我们看看,你的主循环中有多少行代码?
东南:10,000。
我:什么语言?
SE:Fortran
Me:好的,每行 Fortran 大约 10 行机器代码,所以每个循环有 100,000 条指令;循环每秒执行多少次?
SE:每 1/20 秒。
我:好的,那就是 20 x 100,000 = 2mops(这比我们当时的任何东西都快),也许我们最好重新考虑一下。

这让我想知道,现代语言的数量是多少,比如 Ruby?如何发现?

0 投票
2 回答
27467 浏览

assembly - "rep; nop;" 是什么意思?在 x86 程序集中是什么意思?它与“暂停”指令相同吗?

  • 是什么rep; nop意思?
  • pause指令一样吗?
  • 它与rep nop(没有分号)相同吗?
  • 与简单nop指令有什么区别?
  • 它在 AMD 和 Intel 处理器上的行为是否不同?
  • (奖励)这些说明的官方文档在哪里?

这个问题的动机

另一个问题的评论中进行了一些讨论后,我意识到我不知道rep; nop;在 x86(或 x86-64)程序集中是什么意思。而且我在网上找不到很好的解释。

我知道这rep是一个前缀,意思是“重复下一条指令cx时间”(或者至少在旧的 16 位 x86 程序集中是这样)。根据Wikipedia 上的这个汇总表,它似乎rep只能与movs, stos, cmps,lods一起使用scas(但也许这个限制在较新的处理器上被删除了)。因此,我认为rep nop(没有分号)会重复一次nop操作cx

然而,经过进一步的搜索,我变得更加困惑。似乎rep; nopandpause 映射到完全相同的操作码,并且pause具有与 just 不同的行为nop。2005 年的一些旧邮件说了不同的话:

  • “尽量不要烧太多电”
  • “它相当于 'nop' 只是使用 2 字节编码。”
  • “这对英特尔来说很神奇。它就像'nop,但让另一个 HT 兄弟运行'”
  • “它在英特尔上暂停,在 Athlon 上快速填充”

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

它在 Linux 内核中使用(在i386x86_64上),连同这条评论:/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */它也在BeRTOS 中使用,带有相同的评论。

0 投票
5 回答
606 浏览

performance - 如果编译语言最终成为机器代码,为什么它们的性能不一样?

例如,如果 C#、Java 或 C++ 都编译为机器代码,为什么它们的性能不一样?

我的理解是,这些语言是机器代码的抽象,它们最终都编译成这样。处理器不应该决定性能吗?

0 投票
1 回答
2933 浏览

c - 汇编如何将 IMUL 操作码(只有一个操作数)转换为 C 代码

说我得到

EDX = 0xA28

EAX = 0x0A280105

我运行这个 ASM 代码

IMUL EDX

据我了解,仅使用 EAX .. 如果指定了一个操作数

所以在C代码中应该是这样的

EAX *= EDX;

正确的?

在查看调试器之后..我发现EDX也被改变了。

0x0A280105 * 0xA28 = 0x67264A5AC8

在调试器中

EAX = 264A5AC8 EDX = 00000067

现在,如果您接受答案0x67264A5AC8并拆分第一个十六进制对,0x67 264A5AC8 您可以清楚地看到为什么EDXEAX是它们的方式。

好的,所以发生了溢出......因为它不能将这么大的数字存储到 32 位中。所以它开始在 EDX 中使用额外的 8 位

但我的问题是我现在如何在 C 代码中执行此操作以获得相同的结果?

我猜它会像

0 投票
1 回答
553 浏览

c - 汇编如何在没有 ZF 标志访问的情况下将 JNE 转换为 C 代码

ASM 到 C 代码的模拟几乎完成了.. 只是试图解决这些第二遍问题。

假设我得到了这个 ASM 功能

我的程序将为它创建以下内容。

因为JNE 401057不使用CMPorTEST

如何在 C 代码中解决这个问题?

0 投票
1 回答
8365 浏览

c - 汇编 如何将 REP STOS 转换为 C 代码

我调试REP STOS DWORD PTR ES:[EDI]了一段时间

根据我的结论,它总是使用

ECX作为计数器。 EAX作为将被复制EDI然后附加ECX时间的值,因此在放入指向的转储之后EDI

它似乎用它似乎总是只使用 ECX 作为计数器,同时将 EDI 更改了 4 个字节来覆盖 EDI 中的指向数据。当计数器达到 0 时它停止工作

所以我想出了这种代码

似乎工作..但我很担心,因为我只是靠运气和猜测工作做到了这一点。坚固吗?就像它总是ECX像计数器一样,EAX像数据一样,它总是复制 4 个字节,永远不会少?