有时当我使用 Visual Studio 进行调试时,我会看到此选项 no source code available, show disassembly
,单击后会显示如下内容
0000001f test eax,eax
00000021 je 0000000000000028
00000023 call FFFFFFFFF779C1D0
00000028 cmp qword ptr [rsp+48h],0
这种汇编语言是特定于处理器的吗?如果是,开发人员通常使用它进行调试吗?我学过的唯一汇编语言是 8085,我已经不记得了。
答案1
是的,这就是组装。
0000001f test eax,eax
00000021 je 0000000000000028
test eax,eax
检查 eax 寄存器是否为零。
如果是,则跳转到地址 0x28。(je
跳转相等),跳过下一个调用。如果不是零,则不会跳过下一个调用。
不管怎样,它都会继续从 00000028 开始cmp qword ptr [rsp+48h],0
所有这些都是由一个 15 年来没有使用过 i386 汇编的人写的,他必须通过 google 才能找到答案像这些。
(这是我礼貌的说法:“请在询问之前先做一些调查”)。
该汇编语言是特定于处理器的吗?
组装特定于处理器范围/系列。
例如,这个可以在 AMD opteron、AMD K6、K7、intel celeron、intel core 等上运行(所有 i386-ish 代码)
而类似这样的操作可以在 6502、6510 和类似机器上运行:
sei
lda #$0d
sta $0314
lda #$c0
sta $0315
cli
rts
如果是,开发人员通常使用它来调试吗?
我认为大多数人不知道。我认为一般的开发人员甚至不知道什么是汇编代码或机器代码。他们也不知道地址总线、数据总线、缓存行、内存架构或任何“深层”的东西。
然而我们中的一些人确实如此。
我所学过的唯一的汇编语言是针对 8085 的,我已经不记得了。
这是您在示例中使用的代码的前身。
答案2
是的,这是实际的反汇编,并且特定于所使用的处理器。在这种情况下,“eax”寄存器表示 x86 微处理器架构。
不,开发人员不会一般来说使用它进行调试,他们使用源代码(出于某种原因你似乎没有找到)。但它可用于查找代码中的漏洞、编译器中的错误等。
答案3
.NEt 代码编译为中间汇编语言,称为 MSIL 或 CIL。此汇编程序不像传统汇编语言那样特定于 CPU,而是在运行时由 .Net Frameworks 虚拟机 JIT(即时)编译为本机汇编,就像 Java 一样。MSIL 可以在任何具有 .Net Framework 版本的 CPU 架构上运行。
以下是 IL 的介绍 http://www.codeproject.com/Articles/3778/Introduction-to-IL-Assembly-Language
大多数现代开发人员并不使用程序集,但是如果您使用的是闭源程序集,那么查看 IL 就是您唯一能做的。如果您对它很了解,它也可能帮助您优化代码,但只有 1/20 左右的 .Net 开发人员有理由明确使用它。
答案4
是的,该汇编语言看起来是特定于x64
处理器的。使用 Visual Studio,由于它只在 Windows 上提供,因此您可能只会遇到 Intel 架构(尽管 ARM 在 Linux 中也很常见)。但是,有些指令对许多架构都是通用的(例如mov
,add
和其他 -test
在tst
ARM 中)。
不,开发人员不会使用它进行调试。如果在 Visual Studio 中,某些代码中存在错误,则可能不是由他们没有源代码的代码引起的。例如,可能有一个null
指针被意外传递给库调用。由于 VS 会将您带到错误实际所在的代码行导致错误null
,这让它看起来像是库函数中有一个错误(而实际上是首先传递指针的代码有错误)。
虽然您可以在 Assembly 中调试,但通常使用构建项目的语言(如C
或C++
)进行调试。