2012-02-12 3 views
0

Я занимаюсь программированием в сборке, делая код C. Я не понимаю преобразования параметра в целое число с использованием atoi. Может кто-нибудь объяснить мне, как я, как интерпретировать следующий фрагмент кода:Call atoi (Assembler) printf (Assembler)

movl 12(%ebp), %eax ; move a parameter to %eax 
addl $4, %eax  ; add 4 bytes 
movl (%eax), %eax ; magic things 
movl %eax, (%esp) ; magic things 
call atoi   ; atoi call 
movl %eax, 24(%esp) ; asign the result of a magic procedure to a new variable 

Я понимаю, некоторые инструкции, но магические процедуры немного неоднозначные для меня.

Кроме того, я хочу знать, как работает вызов функции Printf, это сегмент кода:

movl $.LC1, %eax ; assing the string (%d\n) to %eax 
movl 28(%esp), %edx ; move the value to print to %edx 
movl %edx, 4(%esp) ; magic things 
movl %eax, (%esp) ; magic things 
call printf   ; call to printf 

Заранее спасибо за поддержку.

+0

что с ними связано? paranthesis подобны разыменованию указателя, afaik –

+0

Извините, если вопрос слишком пустой, но, это первый раз, когда я читал, использовал и «переводил» Assembly; и я нашел много текстов, объясняющих то же самое, что вы говорите ... Мне нужно что-то более явное. Заранее спасибо. – user1170251

ответ

1

% EAX это значение сохраняется в регистре

(% EAX) является значением в памяти, используя значение сохраняется в EAX

Е.Г. movl 4, %eax
Это устанавливает значение EAX до 4.

значение (%) EAX теперь все, что находится в памяти по адресу 4.

movl (%eax), %eax ; move the value in memory of eax (value eax points to) to the address of register eax 
movl %eax, (%esp) ; move the address of eax to the value in memory of esp (value that esp points to) 

movl %edx, 4(%esp) ; move the address of edx to the value in memory of esp + 4 
movl %eax, (%esp) ; move the address of eax to the value in memory of esp 

Причина первый пример у вас только movl %eax, (%esp), потому что atoi принимает только один аргумент.

Во втором примере используется movl %edx, 4(%esp), потому что eax уже используется, а printf принимает два аргумента.

+0

Теперь я думаю, что это то же самое, что и указатели в C ... Хотя mov $ 4, 4 (% esp) такое же, что int a = 4; mov (% eax),% eax такое же, что int * eax =% eax Это правильно? – user1170251

+0

'movl (% eax),% eax' похоже на 'register_eax = * (unsigned long *) register_eax;' in C. – Appleman1234

+0

Вторая строка вводит в заблуждение imho. вы ссылаетесь на «адрес% eax» в качестве первого аргумента movl, но как регистр может иметь адрес? адреса для памяти. регистры не являются памятью. также «значение памяти% esp» тоже запутывает. здесь следует использовать термин адрес! –

0

В скобках указаны косвенная адресация (подумайте о указателе-разыменовании). number(register) означает «добавить смещение number до разыменования».

О том, как вызвать другие функции, см. В calling conventions для вашей системы. Для x86-32 см. this.