在 Linux 上,/proc/cpuinfo
允许以一种简单的方式检查机器具有的所有 CPU 标志。
通常,如果程序需要机器指令集的超集,确定它的最简单方法是运行它并查看它是否发出SIGILL信号。
但就我而言,我所有的处理器都至少支持 SSE4.1 和 AVX。
那么,有没有一种简单的方法来检查二进制文件内部是否有特殊指令?
我正在寻找一些表格或类似的东西,可以帮助我计算汇编代码的效率。
据我所知,位移需要 1 个 CPU 时钟,但我真的在看需要多少加法(减法应该相同),乘法以及如果我知道正在除法的值,如何大概计算除法时间。
我真的需要有关整数值的信息,但也欢迎浮动执行时间。
所以我最近发现有一个HLT
用于停止 CPU的操作码。酷,让我们看看会发生什么!
user@box:~$ cat > test.c
int main(void)
{
__asm__("HLT");
return 0;
}
user@box:~$ gcc -o test test.c
user@box:~$ ./test
Segmentation fault (core dumped)
user@box:~$
Run Code Online (Sandbox Code Playgroud)
呸!多么无聊。
原来HLT
是一个特权指令,所以让我们尝试别的东西。
user@box:~$ mkdir test; cd test
user@box:~/test$ cat > test.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
int init_module(void)
{
__asm__("hlt");
return 0;
}
void cleanup_module(void)
{
}
user@box:~/test$ echo obj-m += test.o > Makefile
user@box:~/test$ make -C /lib/modules/$(uname -r)/build modules M=$(pwd)
[...]
user@box:~/test$ sudo insmod test.ko
user@box:~/test$
Run Code Online (Sandbox Code Playgroud)
没发生什么事!无聊的!
事实证明,HLT …
据我所知,每个程序都由一组处理器指令组成,其中包含一些特定的数据变量(float、int、char...),用于处理处理器寄存器。
因此,我(很久以前)想到的第一件事是,如果您知道%¨#$¨#
(只是一个随机示例)的 ASCII 值可以解释为x86的堆栈指针寄存器(只是示例)的地址处理器。如果这是真的,每次在读取二进制文件的内容时发现这个“不可读”的值,您就可以解释堆栈指针寄存器正在用于管理某些数据变量。
不幸的是,这不会发生。下面是一个ping.exe
从 Windows 中打开的程序内容示例notepad.exe
:
它是一个二进制文件,其数据对于我们人类来说是不可理解的(对于机器来说是可以理解的。)即使他们知道汇编代码(机器语言的最低级别),对任何人来说也没有任何意义。
所以,如果我正确理解了一切,有人可以解释一下吗
旧版本的 x64 处理器不支持用于执行原子 128 位内存交换的 cmpxchg16b 指令,但似乎新版本的处理器已经支持了好几年了。我遇到 64 位机器的旧处理器缺少此指令的可能性有多大?
我正在寻找一种方法来查看文件的所有位。我想查看文件中的所有 01,因为我想知道使用闭源应用程序编辑文件时到底发生了什么变化。
我是 Win 7 RC1 (x64) 机器上的 .net 开发人员,我碰巧注意到我的 GAC(全局程序集缓存)文件夹的大小为 1.2 GB(1700 个文件)。
这让我想知道“正常”大小是什么以及拥有这么大的尺寸可能会产生什么超出显而易见的含义。
我有一个带有未知 FS-(文件系统)的软盘。我想从中复制一份,但我不能,因为 Windows 和 Linux 似乎都无法从中读取。
我尝试了许多最流行的应用程序来制作图像文件(例如 isomeric、winimage 等),但它们都无法制作图像。
在 Linux 上,我尝试使用dd
命令复制它,但似乎甚至dd
无法复制。我在从磁盘读取时遇到很多错误,我查了一下,发现dd
由于扇区损坏而无法从中读取 - 但是当我在 HITACHI 系统上测试该软盘时,它工作正常,但我没有得到任何错误错误。
问题是:我怎样才能从这种类型的软盘上复制一份?我听说我可以使用 BIOS 中断来处理这种事情?
Vim 没有正确缩进汇编代码,无论我是否希望它自动缩进,或者如果我尝试gg=G
它只会显示## 行缩进,即使它没有改变任何内容并且我的所有文本仍然左对齐。
我一直在研究汇编语言的工作原理,因为我想了解我的计算机在 CPU 寄存器/硬件级别上实际发生的复杂和奇特的事情是如何发生的。有什么办法可以看到正常使用电脑时发生了什么?
我想学习,当我说,浏览互联网或玩游戏等时,什么样的东西进出各种寄存器。虽然即使我能看这个,我也不知道如何关联它我可以看到在更高级别发生的特定计算。也就是说,我不知道我怎么知道此时进入这个寄存器的这个十六进制代码是否与 Firefox 处理 SSL 加密等有关。
assembly ×10
linux ×3
cpu ×2
x86 ×2
64-bit ×1
binary-files ×1
cache ×1
floppy ×1
hex-editor ×1
indentation ×1
iso-image ×1
latency ×1
logging ×1
text-editing ×1
vim ×1
windows ×1