leal 4(%esp), %ecx /* теперь в ecx указатель на первый параметр */
andl $-16, %esp
pushl -4(%ecx) /*положить в стек из памяти по адресу ecx-4 (это esp в начале) */
pushl %ebp /* "содержимое указателя копируется в ebp" - это неправда*/
movl %esp, %ebp
pushl %ecx /* "содержимое указателя копируется в ecx" - это не правда*/
subl $36, %esp /* резервирет место на стеке (36 байт) для хранение целого числа - 36 байт для одного числа?! это для 9 чисел!*/
movl $144, -16(%ebp)
Вопрос такой, что это за ячека такая куда записывается число 144 и где оно вообще - это посередине тех резервированных 36-и байт
movl -16(%ebp), %eax
movl %eax, 4(%esp) /*запись содержимого eax(число 144) в esp(адрес больше на 4 чем содержимое базового
регистра) - это тоже в резервированных 32ух байтах */
Помочь в разборе кода транслированного из С в ассемблер
Программа извлекает корень из числа 144
Вот собственно код уже с мойми комментами
Вопрос в коде, так удобнее
Заранее спасибо что хотя бы просмотрели код
.file "korni.c"
.section .rodata
.LC0:
.string "Chislo = %d\n"
.LC1:
.string "Otvet = %d\n"
.text
.globl main /* имя main становится глобальным и доступным для линковшика*/
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp /*сумма*/
pushl -4(%ecx) /**/
pushl %ebp /*содержимое указателя копируется в ebp*/
movl %esp, %ebp /* запись значения из esp в ebp*/
pushl %ecx /*содержимое указателя копируется в ecx*/
subl $36, %esp /* резервирет место на стеке (36 байт) для хранение целого числа*/
movl $144, -16(%ebp) /* запись числа 144 в ebp(адрес меньше на 16 чем содержимое базового регистра)*/
Вопрос такой, что это за ячека такая куда записывается число 144 и где оно вообще
movl -16(%ebp), %eax /*запись содержимого регистра ebp(число 144) в eax*/
movl %eax, 4(%esp) /*запись содержимого eax(число 144) в esp(адрес больше на 4 чем содержимое базового
регистра)*/
movl $.LC0, (%esp) /* запись значения .LC0 (строки "Chislo = %d\n") в esp*/
call printf /* передача управления подпрограмме printf котороя в выводит строчку "Chislo = %d\n"*/
movl $1, -12(%ebp) /* запись числа 1 в ebp(адрес меньше на 12 чем содержимое базового регистра)*/
movl $0, -8(%ebp) /* запись числа 0 в ebp(адрес меньше на 8 чем содержимое базового регистра)*/
jmp .L2 /* безусловный переход на метку L2*/
.L3:/* метка L3
movl -12(%ebp), %eax /* запись значения ebp(адрес меньше на 12 чем содержимое базового регистра) в eax*/
subl %eax, -16(%ebp) /* резервирование место в стеке (eax то есть 1 байта) для хранения целого чилса в
ebp(адрес меньше на 16 чем содержимое базового регистра)*/
addl $2, -12(%ebp) /* увеличенает содержимое регистра указетеля ebp(адрес меньше на 12 чем содержимое базового
регистра) на 2 */
addl $1, -8(%ebp) /* увеличенает содержимое регистра указетеля ebp(адрес меньше на 8 чем содержимое базового
регистра) на 1 */
.L2: /* метка L2
cmpl $1, -16(%ebp) /* сравнение значение ebp(адрес меньше на 16 чем содержимое базового регистра) с 1*/
jg .L3 /* переход на метку L3 при выполнение условия выше*/
movl -8(%ebp), %eax /* запись значения ebp(адрес меньше на 8 чем содержимое базового регистра) в eax */
movl %eax, 4(%esp) /*запись значения eax в esp(адрес больше на 4 чем содержимое базового регистра)
movl $.LC1, (%esp) /*запись значения .LC1 (строки "Otvet = %d\n") в esp*/
call printf /* передача управления подпрограмме printf котороя в выводит строчку "Otvet = %d\n"*/
movl $0, %eax /* запись 0 в eax*/
addl $36, %esp /* увеличенает содержимое регистра указетеля esp на 36*/
popl %ecx /*копирует число из вершины стрека в регистр ecx */
popl %ebp /*копирует число из вершины стрека в регистр ebp*/
leal -4(%ecx), %esp
ret /*передает управление среде*/