Thắc mắc về cấp bộ nhớ bên trong stack

Em thực hiện sinh đoạn mã assembly bằng GCC từ 1 đoạn code đơn giản sau ở trong C:

  2 long swap_add(long *xp, long *yp)
  3 {
  4     long x = *xp;
  5     long y = *yp;
  6     *xp = y;
  7     *yp = x;
  8     return x + y;
  9 }
 10 long caller()
 11 {
 12     long arg1 = 534;
 13     long arg2 = 1057;
 14     long sum = swap_add(&arg1, &arg2);
 15     long diff = arg1 - arg2;
 16     return sum * diff;
 17 }
  2 long swap_add(long *xp, long *yp)
  3 {
  4     long x = *xp;
  5     long y = *yp;
  6     *xp = y;
  7     *yp = x;
  8     return x + y;
  9 }
 10 long caller()
 11 {
 12     long arg1 = 534;
 13     long arg2 = 1057;
 14     long sum = swap_add(&arg1, &arg2);
 15     long diff = arg1 - arg2;
 16     return sum * diff;
 17 }
Đoạn mã sinh bởi GCC cho hàm caller:
 caller:
 39 .LFB1:
 40         .cfi_startproc
 41         pushq   %rbp
 42         .cfi_def_cfa_offset 16
 43         .cfi_offset 6, -16
 44         movq    %rsp, %rbp
 45         .cfi_def_cfa_register 6
 46         subq    $32, %rsp
 47         movq    $534, -24(%rbp)
 48         movq    $1057, -32(%rbp)
 49         leaq    -32(%rbp), %rdx
 50         leaq    -24(%rbp), %rax
 51         movq    %rdx, %rsi
 52         movq    %rax, %rdi
 53         call    swap_add
 54         movq    %rax, -8(%rbp)
 55         movq    -24(%rbp), %rdx
 56         movq    -32(%rbp), %rax
 57         subq    %rax, %rdx
 58         movq    %rdx, %rax
 59         movq    %rax, -17(%rbp)
 60         movq    -8(%rbp), %rax
 61         imulq   -16(%rbp), %rax
 62         leave
 63         .cfi_def_cfa 7, 8
 64         ret
 65         .cfi_endproc
Em thắc mắc ở dòng 59, tại sao lại là movq %rax, -17(%rbp), em nghĩ phải là %rax, -16(%rbp) mới hợp lý chứ. Hi vọng mọi người có thể giải đáp giúp em. Em xin cảm ơn.

thế em thay dấu - bằng dấu + ở dòng này thì nó thế nào?

long diff = arg1 - arg2;
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?