2014-09-30 2 views
2

Я изучаю сборку, и моя задача состояла в том, чтобы преобразовать простую программу с 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-битные регистры.

+1

Узнайте, как использовать отладчик. Сделайте некоторые отладки. Затем спроси. –

+0

@IraBaxter Извините, я пытаюсь отлаживать с помощью gdb. У меня было всего 2 дня, чтобы изучить сборку, поэтому ее отладка тоже запутывает. – mrQWERTY

+1

Понял. Я предлагаю вам запустить свою программу под gdb с помощью ПК в .start. Шаг * одна * инструкция за раз. Внимательно посмотрите на регистры, чтобы убедиться, что вы точно понимаете, что это за инструкция. Если бы он сделал что-то, что вас удивляет, прочитайте об этом, пока не узнаете, почему. Не принимайте * ничего *. Узнайте о «шаг за шагом» против «step_over» (серьезно!). Это часть процесса обучения. Сделайте это в течение нескольких часов. да, первый раз болезнен; это становится намного проще, поскольку вы делаете больше. Ваше понимание значительно улучшится, и вы, вероятно, найдете свою ошибку. –

ответ

1

Похоже, вы используете 1 в качестве номера системного вызова, но it seems, что на самом деле это 60. По-видимому, вы не можете предположить, что номера системного вызова не совпадают с 32-битным Linux до 64-битного.

При дальнейшем осмотре, кажется, есть еще несколько вещей.

  • Вы не проходите арг на стек в 64-битном (если вы не так много, они не будут вписываться в данных регуляр. Посмотрите на Linux 64bit соглашения о вызовах)
  • В основном, вы нажимаете- dwords, но у вас есть 2 qwords из стека.

Все места, в которые вы используете movq для доступа к памяти, скорее всего, не работают должным образом, потому что обращения предназначены для использования в словах. Вы читаете или записываете более высокие 32 числа номера без значения.

+0

Здравствуйте, спасибо за ответ. К сожалению, программа все еще висит :( – mrQWERTY

Смежные вопросы