% 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 принимает два аргумента.