Call atoi (Ассемблер) printf (Ассемблер) - PullRequest
0 голосов
/ 12 февраля 2012

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

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

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

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

% eax - это значение, хранящееся в регистре

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

Например, movl 4, %eax
.eax to 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 голосов
/ 12 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...