Visual Studio 显示的反汇编实际上是汇编吗?

Visual Studio 显示的反汇编实际上是汇编吗?

有时当我使用 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 中也很常见)。但是,有些指令对许多架构都是通用的(例如movadd和其他 -testtstARM 中)。

不,开发人员不会使用它进行调试。如果在 Visual Studio 中,某些代码中存在错误,则可能不是由他们没有源代码的代码引起的。例如,可能有一个null指针被意外传递给库调用。由于 VS 会将您带到错误实际所在的代码行导致错误null,这让它看起来像是库函数中有一个错误(而实际上是首先传递指针的代码有错误)。

虽然您可以在 Assembly 中调试,但通常使用构建项目的语言(如CC++)进行调试。

相关内容