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.