更改数据部分的顺序会影响使用RIP相对寻址的x64的结果

时间:2018-02-11 22:22:09

标签: assembly x86-64

我正在编写一些x86-64程序集,并且更改数据部分的顺序似乎会改变结果。

以下是数据部分:

        .data
pstr:   .asciz "%d\n"
a:      .long 10
b:      .long 3
c:      .long 300
dnm2:   .long 0

这是代码,它正在执行a = b / a然后打印a。 (以复杂的方式,但这不是问题)。当前的顺序(a,b,c)给出结果99,而更改的顺序(b,a,c)给出结果0.我使用clang从gcc生成我的可执行文件。

    .text
    .globl main
 main:
    pushq   %rbp
    movq    %rsp, %rbp

    movq    a(%rip), %rax
    movq    %rax, %rbx
    movq    %rax, %rbx
    movq    b(%rip), %rcx
    movq    %rcx, %rax
    movq    %rax, a(%rip)
    movq    %rbx, dnm2(%rip)
    movq    a(%rip), %rax
    movq    dnm2(%rip), %rbx
    xorq    %rdx, %rdx
    idiv    %rbx
    movq    %rax, a(%rip)

    movq    a(%rip), %rsi
    leaq    pstr(%rip), %rdi
    call    printf@PLT

    movq    %rsp, %rbp
    popq    %rbp
    ret

0 个答案:

没有答案