如何指示汇编指令?

要详细说明标题上的问题,假设我在C ++中声明了以下数组,

int myarr[10];

这在x86中反汇编为以下内容

myarr:
    .zero   40

现在,AFAIK这个.zero指令用于约定,不是指令。那么,该指令如何准确地转换为x86(或任何其他体系结构,此处不再强调)指令?因为就我们所知,CPU只能执行指令。所以我想这些指令已以某种方式转换为指令,对吗?

我还可以通过询问如何将.word .long等翻译成指令来概括这个问题,但是我认为这很清楚。

lgh19751228 回答:如何指示汇编指令?

汇编器的输出是一个目标模块。在对象模块中是程序各个部分的表示。每个部分都有一个大小,一些属性以及可能要放入该部分的数据。

例如,一个节可能是几千个字节,具有指示其包含要执行的指令的属性,并具有由这些指令组成的数据。另一部分可能是几百个字节,但是没有数据,它只是程序启动时要分配的空间。程序启动时,另一部分可能很大,并且包含非零数据,其中包含其初始值。

要汇编.zero 40指令,编译器在当前正在构建的部分中仅包含40个字节的零。当写入最终输出时,它将在该部分中包含那些零。这样的数据指令和.word之类的数据指令仅告诉汇编程序将哪些数据放入其输出中。

,
unsigned int stuff[10];
void fun ( void )
{
    unsigned int r;
    for(r=0;r<10;r++) stuff[r]=r;
}

使用ARM ...

00000000 <fun>:
   0:   e3a03000    mov r3,#0
   4:   e59f2010    ldr r2,[pc,#16]   ; 1c <fun+0x1c>
   8:   e5a23004    str r3,[r2,#4]!
   c:   e2833001    add r3,r3,#1
  10:   e353000a    cmp r3,#10
  14:   1afffffb    bne 8 <fun+0x8>
  18:   e12fff1e    bx  lr
  1c:   00000ffc

Disassembly of section .bss:

00001000 <stuff>:
    ...

数组中的东西仅仅是数据,不是代码,不是指令,也不会是,您所询问的指令不会成为代码,它无法成为数据。

如果您想查看代码,说明,则需要放置作用于数据的高级语言行,例如此处所示。在这种情况下,编译器会生成代码。

查看此编译器的实际输出(删除了注释和其他非必要内容)

fun:
    mov r3,#0
    ldr r2,.L6
.L2:
    str r3,#4]!
    add r3,#1
    cmp r3,#10
    bne .L2
    bx  lr
.L7:
    .align  2
.L6:
    .word   stuff-4
...
    .comm   stuff,40,4

在这种情况下,.comm是他们如何使用高级语言声明表示数组的数据的方式。其他的东西主要是代码。 .align在那里,因此L6的地址被对齐,以便在尝试读取它时不会遇到对齐错误。

.word是一个指令,您在这里看到的是.text vs .data,而它只是一个简单的C程序,数组和代码彼此相邻。因为代码可能可以驻留在只读存储器(如闪存)中,并且数据需要位于读/写存储器中,并且在编译时编译器不知道数据相对于代码的位置,所以它通过放置只读来生成抽象链接器稍后填充的代码中的单词,该代码是通用的,无论链接器在其中使用什么。在这种情况下,链接器将“ .text”和“ .bss”放置在未初始化的位置,因此实际上不是.data,然后在代码中建立该连接。

标签是指令,如果您愿意的话,程序员或代码生成器(编译器)不必计数指令或指令的整体大小即可进行相对跳转。让工具为您做到这一点。

  1c:   00000ffc 

Disassembly of section .bss:

00001000 <stuff>:
    ...

,根据我链接此程序(实际上不是工作程序)的方式,是该程序中唯一的数据项,链接器将其放在我在地址0x1000处询问的位置,然后返回并在该.word指令中填充到是stuff-4,它是0xFFC,以便编译后的代码可以正常工作。

指令不是指令集的一部分,而是汇编语言的一部分,请注意,汇编语言是由汇编器,工具而不是指令集/目标定义的。 x86汇编语言有无数种不同,AT&T与Intel并不是主要区别,这些指令是如何定义标签的,指示数字是十六进制还是十进制的,因为早期文档中定义的指令含糊不清形容词,如果您能够指定您实际上跟随的是mov指令,即使这是该指令的一部分,而不是指令,则这些形容词会在汇编语言中变化。 ARM,MIPS和许多(如果不是大多数)其他工具都使用不兼容的汇编语言创建了工具。 .zero例如是不兼容的事物之一。

无论如何,有问题的汇编语言都需要能够定义数据,然后有一种方法使代码可以引用该数据以创建有用的程序。

一对一汇编语言到指令的概念非常容易引起误解,也不会被它所迷惑,如今的编译器在其输出中生成的非代码几乎与代码一样多。很多指令和其他信息。

本文链接:https://www.f2er.com/2712022.html

大家都在问