Я изучаю сборку, и моя задача состояла в том, чтобы преобразовать простую программу с 32-бит на 64 бит. Программа вычисляет 2^3 + 5^2. Моя программа отлично компилируется, однако, когда я запускаю ее, программа не прерывается. Поэтому мне нужно Ctrl + C в командной строке, чтобы фактически остановить программу. Я думал, что проблема изначально состояла в том, что я использовал int 0x80
для завершения, но после того, как я перешел на syscall
, проблема не исчезла.x86 Программа сборки не заканчивается
Код:
1 .section .data
2 .section .text
3 .globl _start
4 _start:
5 push $3
6 push $2
7
8 call power
9 addq $8, %rsp
10
11 push %rax
12
13 push $2
14 push $5
15
16 call power
17 addq $8, %rsp
18 pop %rbx
19
20 addq %rax, %rbx
21
22 movq $1, %rax
23 syscall
24
25 .type power, @function
26 power:
27 push %rbp
28 movq %rsp, %rbp
29 subq $4, %rsp
30
31 movq 8(%rbp), %rbx
32 movq 12(%rbp), %rcx
33
34 movq %rbx, -4(%rbp)
35
36 power_loop_start:
37 cmpq $1, %rcx
38 je end_power
39
40 movq -4(%rbp), %rax
41 imulq %rbx, %rax
42 movq %rax, -3(%rbp)
43 decq %rcx
44 jmp power_loop_start
45
46 end_power:
47 movq -4(%rbp), %rax
48 movq %rbp, %rsp
49 pop %rbp
50 ret
Я извиняюсь за размещение этого много кода, но мне нужно руководство, как я совершенно невежественны. Я искал долгое время безрезультатно. Заранее спасибо. BTW, программа работает до преобразования ее в 64 бит. Я просто изменил все movl
и т. Д. До movq
и использовал 64-битные регистры.
Узнайте, как использовать отладчик. Сделайте некоторые отладки. Затем спроси. –
@IraBaxter Извините, я пытаюсь отлаживать с помощью gdb. У меня было всего 2 дня, чтобы изучить сборку, поэтому ее отладка тоже запутывает. – mrQWERTY
Понял. Я предлагаю вам запустить свою программу под gdb с помощью ПК в .start. Шаг * одна * инструкция за раз. Внимательно посмотрите на регистры, чтобы убедиться, что вы точно понимаете, что это за инструкция. Если бы он сделал что-то, что вас удивляет, прочитайте об этом, пока не узнаете, почему. Не принимайте * ничего *. Узнайте о «шаг за шагом» против «step_over» (серьезно!). Это часть процесса обучения. Сделайте это в течение нескольких часов. да, первый раз болезнен; это становится намного проще, поскольку вы делаете больше. Ваше понимание значительно улучшится, и вы, вероятно, найдете свою ошибку. –