我有以下汇编代码

.LC0:
    .string "%d\n"
    .text
    .globl  main
    .type   main, @function
main:
    leaq    .LC0(%rip), %rdi
    movl    $5, %esi
    movl    $0, %eax
    call    printf@PLT


我不想打印出5,而是想打印出当前位置和第一个函数(名为func)之间的空间,我一直在尝试以下操作:
var1:
    .long .-func
.LC0:
    .string "%d\n"
    .text
    .globl  main
    .type   main, @function
main:
    leaq    .LC0(%rip), %rdi
    movl    var1, %esi
    movl    $0, %eax
    call    printf@PLT

我试过了
.size var1, .-func
.LC0:
    .string "%d\n"
    .text
    .globl  main
    .type   main, @function
main:
    leaq    .LC0(%rip), %rdi
    movl    var1, %esi
    movl    $0, %eax
    call    printf@PLT

到目前为止,我所做的一切都没有起到作用,任何帮助都将不胜感激。

最佳答案

您的尝试:

var1:
    .long .-func

将生成一个值为其与func之间距离的对象我理解您的问题,您需要主通话点与func之间的距离比如说:
leaq    .LC0(%rip), %rdi
movl    $.-func, %esi
movl    $0, %eax
call    printf@PLT

如果需要,您可以使用.中特定指令的标签,而不是main
.size指令与您想要的内容无关,尽管它是您可能已经看到过的一个常见用法它的唯一目的是帮助调试/反汇编,使.-symbol正确地标识地址所属的符号,并且(对于数据)使复制重定位工作。

关于c - 如何在GNU汇编器中打印出通过.size指令分配的符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57121389/

10-16 20:47