Сборка x86_64 отображает остаточные значения - PullRequest
0 голосов
/ 20 сентября 2019

Я хочу взять число с консоли и отобразить его с шагом 1. Но результат не тот, который я хочу отобразить.Можете ли вы объяснить мне, что я сделал не так?(Я совсем не разбираюсь в сборке)

.data
number: .long 0
numberformat: .asciz "%ld"
assig: .asciz "text \n \n"
enternumber: .asciz "Enter the number: \n"
numberformat1: .asciz "The input number+1 = %d \n"

.text
.global main
main:           # main
    call print1
    call print2
    call inout
    call exit

inout:
    movq $0, %rax    # clear rax
    movq $numberformat, %rdi    # load format string
    movq $number, %rsi    # set storage to address of number
    call scanf
    pop %rbp
    movq $number, %rbx
    add $1, %rbx
    movq $0, %rax
    movq %rbx, %rsi
    movq $numberformat1, %rdi
    call printf    
    # call printnewnumber
    ret

print1:
    movq $0, %rax
    movq $assig, %rdi
    call printf
    ret

print2:
    movq $0, %rax
    movq $enternumber, %rdi
    call printf
    ret

printnewnumber:
    movq $0, %rax
    movq %rdx, %rsi
    movq $numberformat1, %rdi
    call printf    
    ret

1 Ответ

0 голосов
/ 20 сентября 2019

Строка movq $number, %rbx не копирует сам входной номер, а только адрес .Если вы разыменуете указатель, вы получите желаемый результат:

Изменение вышеупомянутой строки на

movq number(%rip), %rbx   # Dereference pointer and store input number in RBX

приводит к

Assignment 1b: inout

Enter the number:
123
The input number+1 = 124
...