Я пытаюсь принять это C-код и превратить его в АссамблееАссамблея Сегментация вина: 11
#include <stdlib.h>
int sub(int x, int y) {
return 2*x+y;
}
int main(int argc, char ** argv) {
int a;
a = atoi(argv[1]);
return sub(argc,a);
}
Я использовал gcc -S math.c
, чтобы превратить его в Ассамблее, и, наконец, понял, большинство того, что он делает. Так что я переписал его, как это:
.globl _main
_sub:
push %ebp
mov %esp, %ebp
mov 0x8(%ebp), %eax # int x
mov 0xC(%ebp), %ecx # int y
lea (%ecx, %eax, 2), %eax # 2 * x + y
pop %ebp
ret
_main:
push %ebp
mov %esp, %ebp
sub $0x4, %esp # int a
mov 0xC(%ebp), %eax
push 0x4(%eax) # char* argv[1]
call _atoi
add $0x4, %esp
push %eax # int y
push 0x8(%ebp) # int x/argc
call _sub
mov %ebp, %esp
pop %ebp
ret
Я использую gcc -m32 -Wall math.s -o math
скомпилировать его на OS X, и он прекрасно работает. Но строка sub $0x4, %esp
кажется мне очень ненужной. Поэтому я попытался удалить его, и он компилируется отлично. Но когда я запускаю его, используя ./math 2
без этой строки, он дает мне ошибку Segmentation fault: 11
.
Я не вижу линий, которые выглядят так, как будто они зависят от этой линии. Поэтому мне интересно, почему эта программа нуждается в этой строке и почему ее удаление вызывает эту ошибку? Благодаря!
Очевидно, вы не писать код, если вы не знаете, что это значит. Позаботьтесь о пересмотре своей истории? –
Ну, он был сгенерирован из gcc и скрипта C, но затем я попытался переписать с нуля, и это то, что я получил. – Addison
Если вы планируете включить это, ваш учитель узнает, что вы сами не пишете программу, так как она пахнет кодом, сгенерированным компилятором. Вам лучше начать с нуля. –