Assembly 在NASM生成的列表文件中,操作码中括号的含义是什么?

Assembly 在NASM生成的列表文件中,操作码中括号的含义是什么?,assembly,nasm,opcode,instructions,Assembly,Nasm,Opcode,Instructions,当查看NASM生成的列表文件时,我看到有三种操作码: 没有括号 带圆括号 带方括号 他们是什么意思?什么时候使用它们 这是一个清单文件示例,演示了上述所有内容: 1 section .text 2 extern printf 3 extern fgets 4 00000000

当查看NASM生成的列表文件时,我看到有三种操作码:

  • 没有括号
  • 带圆括号
  • 带方括号
  • 他们是什么意思?什么时候使用它们

    这是一个清单文件示例,演示了上述所有内容:

     1                                  section .text
     2                                      extern printf
     3                                      extern fgets
     4 00000000 313233                  str3:   db "123"
     5                                  main:
     6 00000003 68[00000000]                push    str1
     7 00000008 68[09000000]                push    str2
     8 0000000D 68[00000000]                push    str3
     9 00000012 E8(00000000)                call    func1
    10 00000017 E8(04000000)                call    func2
    11 0000001C E80B000000                  call    func3
    12 00000021 E8(00000000)                call    printf
    13 00000026 E8(00000000)                call    fgets
    14 0000002B C3                          ret
    15                                  
    16 0000002C 90                      func3:  nop
    17 0000002D C3                          ret
    18                                  
    19                                  
    20                                  section .text1
    21 00000000 90                      func1:  nop
    22 00000001 90                          nop
    23 00000002 90                          nop
    24 00000003 C3                          ret
    25                                  
    26 00000004 90                      func2:  nop
    27 00000005 90                          nop
    28 00000006 90                          nop
    29 00000007 C3                          ret
    30                                  
    31                                  
    32                                  section .data
    33                                  
    34 00000000 313233343536373839      str1:   db "123456789"
    35 00000009 313233343536373839      str2:   db "123456789"
    

    它们显示了在连接时将应用重新定位的位置

    [nnnnnn]
    显示绝对重新定位(当链接器执行重新定位时,某些节的基址将添加到偏移量)。e、 g.一旦二进制文件被完全链接,
    push str2
    指令中的字节将被更改为包含
    .data
    +
    0x09
    的基址

    (nnnnnn)
    显示PC相对重定位(用于调用和分支,其中最终值必须与下一条指令的地址相对)。e、 g.
    call func2
    指令中的字节将更新为
    func2
    的最终地址与以下指令的地址之间的差值(
    call func3


    call func3
    指令本身没有括号,因为在这种情况下不需要重新定位-
    call
    指令需要相对地址,但
    func3
    在同一节中,因此相对地址已知(以下指令位于
    .text+0x21
    ,而
    func3
    位于
    .text+0x2c
    ,因此相对地址为
    0xb
    ,而与
    .text
    的最终地址无关).

    括号和方括号表示其中的指令字节部分取决于引用对象的位置,该位置尚未完全确定(可能由操作系统中的链接器和/或程序加载器设置或更改)

    在这里,函数的地址是未知的,因为它们没有在此文件中定义,所以括号中有全零:

    12 00000021 E8(00000000)                call    printf
    13 00000026 E8(00000000)                call    fgets
    
    这里,
    func3
    的地址相对于
    call func3
    的地址是已知的(距离是2Ch-21h=0Bh),不会改变,因此它是固定的,没有括号或括号:

    11 0000001C E80B000000                  call    func3
    12 00000021 ...
    ...
    16 0000002C 90                      func3:  nop
    
     7 00000008 68[09000000]                push    str2
    
    此处,
    str2
    的地址在组装时部分已知,因为它可能在连接时改变,因为它取决于节段之间的距离,因此有括号:

    11 0000001C E80B000000                  call    func3
    12 00000021 ...
    ...
    16 0000002C 90                      func3:  nop
    
     7 00000008 68[09000000]                push    str2
    
    顺便说一句,我无法区分括号和括号之间的区别,可能是代码与数据的区别。NASM文档可能是检查它的好地方。如果没有描述,则有NASM源代码可用,您也可以进行更多的“测试”