问题标签 [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 投票
3 回答
461 浏览

gcc - gdb 中的奇怪结果

我正在阅读一本关于 asm 的 C 书籍,并使用 GDB 查看寄存器和内存。问题是,当我编译和反汇编完全相同的源代码时(实际上是使用随书 cd 提供的源文件),汇编指令看起来与书中的内容有很大不同。这本书使用了英特尔风格的汇编,我将“设置反汇编英特尔”放在 gdb 中,所以不是那样......只是说明的顺序不同,有些完全不同,还有一些其他的怪癖。

例如,书中的 eip 寄存器中有一条 mov 指令:

对应于在 for 循环中将变量 i 初始化为 0 (i = 0, i<10, i++)

但是,在我的 gdb 控制台中,断点位于同一位置(set break main; run)我看到了:

请注意,它一起引用了一个不同的寄存器-如果我检查 esp 的值,则 esp 而不是 ebp,它本身就是 0x1c。但是,如果我尝试检查 0x1c 或 esp+0x1c 的内容,它会告诉我我无法查看这些地址

所以随着这本书的继续,我根本无法跟上,因为它开始跟踪 ebp、ebp-4 等中的内容,而在我的 asm 中似乎没有发生任何事情ebp 寄存器

这本书写于 2008 年,所以我无法想象它已经过时了,以至于 gcc 或 gdb 的版本更改会带来如此重大的变化(或者做到了?)......是否可能有一些编译器优化还是默认打开的东西会产生如此不同的结果?

提前致谢

编辑:奇怪。我尝试了每个建议,但没有任何效果。然后我做了 rm a.out 并重新编译,现在它工作正常(说明仍然与书不同,但我可以检查与书对应的地址;只要我能遵循相应的模式,一切都很好,不必是完全相同的 asm,那只会让它太容易了!)再次感谢您的所有帮助和建议。

0 投票
3 回答
4389 浏览

linux - x86-64 AMD 上 CALL 指令的操作数生成

以下是示例程序的 objdump 的输出,

我需要了解的是,我们主要在地址 - 8048401,调用 80483b4 看到以下内容,但是机器代码是 - e8 ae ff ff ff。我看到 CALL 指令是 E8 但函数 80483b4 的地址如何解码为 FFFFFFAE?我在谷歌上做了很多搜索,但它没有返回任何东西。谁能解释一下?

0 投票
2 回答
2386 浏览

assembly - 逆向工程组装

我是逆向工程的新手,我希望了解更多信息,我试图反汇编一个目标 exe,在其中遇到了一些我无法真正解释的功能。希望有人帮助可以伸出援助之手。

从地址0016105700161093的部分是我不太了解事情进展的地方。其余的只是调用不同的 API,所以没什么大不了的。(文件名已删除)

如果有人可以向我解释粗体部分,我真的很感激。

0 投票
2 回答
1488 浏览

machine-code - 创建一个只有 1 和 0 的 Exe 文件:机器码

我想在记事本中输入几个 1 和 0,另存为 something.exe,然后获取一个程序。显然,它不会很复杂。即使只是打个招呼也行。如何输出文本?如何暂停它以使其不会立即关闭?有没有人有资源说明这一切?

0 投票
4 回答
3431 浏览

assembly - 在什么阶段将软件转换为实际的硬件信号?

程序在机器代码状态后会发生什么?汇编器/编译器将高级代码或汇编代码转换为机器指令。在这个阶段,机器指令仍以软件形式存在于内存中。这段代码如何转换为物理电信号,然后由硬件处理?如果有某种接口设备,我想知道它是如何进行转换的。

0 投票
4 回答
13058 浏览

interpreter - 机器代码如何与处理器通信?

我们以 Python 为例。如果我没记错的话,当你在其中编程时,计算机首先将代码“翻译”为 C。然后再从 C 到汇编。汇编是用机器代码编写的。(这只是我对此的一个模糊想法,如果我错了,请纠正我)但是机器代码是用什么写的,或者更准确地说,处理器如何处理它的指令,它如何“找出”要做什么?

0 投票
2 回答
35437 浏览

assembly - JMP 指令 - 十六进制代码

对JMP机器指令的十六进制代码转换有疑问。我有我想跳转到的绝对地址,比如“JMP 0x400835”。首先,这是允许的吗?如果是,那么对应的十六进制代码是什么?如果没有,我可以先将地址存储在某个寄存器中,比如 EAX,然后输入“JMP EAX”吗?我正在研究 x86(64b) 架构。

我试图从gdb中的diassem输出中打印出十六进制代码,但是没有一致性,即我在十六进制代码中看不到目标地址。

我是十六进制代码和机器指令的新手,所以请原谅我的无知。

0 投票
1 回答
297 浏览

c++ - C++ - 极其奇怪的机器代码行为

完整代码在这里: http: //pastebin.com/MM3vWmqA

在函数 fast_generator 中,我为两个语句添加了注释。如果你切换这些语句,代码运行速度会快 1.8 倍。如果删除第一个语句,代码将比原始版本执行得更快,但与切换它们相比会更慢。

测试用例应该如下。

第一 - 最慢。452 毫秒。

第二 - 比第一个更快。280 毫秒。

第三 - 比第一个快,但比第二个慢。421 毫秒。

原始语句的汇编器输出是。

我已经验证,在切换这些语句时,汇编器输出保持不变,这些 asm 指令的唯一区别是互换了。

我已经用 VC++10 和 VC++11 对其进行了测试,行为相同。有人能解释一下为什么切换这些语句会加速算法 ~ 1.8 倍吗?如果您认为 std::clock() 不准确,请更改 size = 7。在我的机器上,size = 7 的差异是 12000 毫秒与 7000 毫秒。

0 投票
3 回答
8470 浏览

assembly - 实际的机器代码在各个方面是什么样的?

关于机器代码实际上是什么似乎有很多意见。我听说有人说它是汇编、二进制或十六进制。

说机器代码本质上是特定处理器的一组指令是否正确?如果是这样,我想这些可以用二进制或十六进制表示法或汇编来表示。但是未翻译的“实际”机器代码是什么样的?是基于架构的字长吗?还是所有意图和目的的十六进制都是默认表示?

坐在硬盘上时会是什么样子?坐在登记簿上时是什么样子的?当它被处理时,它只是在那一点上的一组电压变化吗?

0 投票
4 回答
1667 浏览

c - 有人可以为上面的 c 程序编写汇编代码,将其转换为小于 100 字节的机器代码吗?

我想溢出数组buffer[100],我将在 FreeBSD 上的 bash shell 上传递 python 脚本。我需要机器代码作为字符串传递以溢出该缓冲区buffer[100]并使程序将其主机名打印到stdout.

这是我尝试过的 C 代码,并在控制台上给出了主机名。:

}


这是我使用 gcc 获得的汇编代码,但比我需要的要长,因为当我查找 c 程序文本部分的机器代码时,它超过 100 个字节,我需要上面 c 程序的机器代码小于 100 字节。


一个人已经在另一台计算机上完成了它,他给了我现成的机器代码,它是 37 字节,他正在使用 perl 脚本以下面的格式将它传递到缓冲区。我尝试了他的代码并且它有效,但他没有告诉我该怎么做。

“\x41\xc1\x30\x58\x6e\x61\x6d\x65\x23\x23\xc3\xbc\xa3\x83\xf4\x69\x36\xw3\xde\x4f\x2f\x5f\x2f\x39\ x33\x60\x24\x32\xb4\xab\x21\xc1\x80\x24\xe0\xdb\xd0”</p>

我知道他是在不同的机器上做的,所以我不能得到相同的代码,但由于我们都使用完全相同的 c 函数,所以机器代码的大小应该几乎相同,如果不完全相同的话。他的机器代码是 37 个字节,他将传递给 shell 以溢出 FreeBSD 2.95 上二进制文件中的 gets() 函数,从而在标准输出上打印主机名。我想做同样的事情,我已经尝试过他的机器代码并且它可以工作,但他不会告诉我他是如何得到这个机器代码的。所以我实际上很关心获取该代码的过程。

好的,我尝试了此处帖子中建议的方法,但仅对于 gethostname() 函数,我得到了 130 个字符的机器代码。它不包括 printf() 机器代码。因为我需要将主机名打印到控制台,所以也应该包括在内,但这会使机器代码更长。我必须将代码放入 100 个字节的数组中,因此代码应该小于 100 个字节。

有人可以为上面的 c 程序编写汇编代码,将其转换为小于 100 字节的机器代码吗?