2017-02-12 51 views
0
.text 
.global main 
main:  
    push %r13 
    push %r14 
    push %r15 
    jmp label 
x: 
    pop %rbx 
    movq $0, %rax 
    movq $1, %r9 
    pushq %r9 
    popq %rsi 
    movq %rsi, %r15 
    .data 
    a1: .quad 0 
    .text 
    mov %r15,a1 
    mov $format,%rdi 
    movq $5, %r9 
    pushq %r9 
    popq %rsi 
    movq %rsi, %r15 
    call printf 
    push a1 
    popq %rsi 
    movq %rsi, %rax 
    push %rbx 
    ret 
label: 
    mov $format,%rdi 
    call x 
    push %rax 
    popq %rsi 
    movq %rsi, %r15 
    call printf 
    mov $0,%rax 
    pop %r15 
    pop %r14 
    pop %r13 
    ret 
.data 
format: .string "%lu\n" 

Ожидаемый выходПочему сборка печатает символ нежелательной почты из возвращаемого значения, если я сначала что-то печатаю?

, но я получаю

Поэтому я говорю, что это первая печать Мессинг его в том, что, когда Я удаляю печать 5, 1 печатается правильно. Я не уверен, почему это испортит 1, когда они будут напечатаны с использованием того же кода.

+2

Что это за сложная сборка? – fuz

+0

@fuz main вызывает метку, которая присваивает значение 1 переменной a1, печатает 5, а затем возвращает значение a1, которое печатается по его названию. Я понимаю, что эти отпечатки могут быть выполнены более легко, но для моих целей мне нужен код, структурированный таким образом. –

+0

@ Ped7g Я использую gdb. Это не помогло решить эту проблему. –

ответ

2

Я исправил проблему, перемещая строку формата в% rdi после вызова метки x.