Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помочь в разборе кода транслированного из С в ассемблер

9.5K
19 декабря 2007 года
Jumper
11 / / 18.06.2005
Нужна не большая помошь, есть ассемблеровскии код, я что смог сам разобрался, может где что не правильно.
Программа извлекает корень из числа 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 /*передает управление среде*/
360
20 декабря 2007 года
P*t*
474 / / 15.02.2007
Код:
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ух байтах */


P.S код надо заключать в [СODE][/СODE] - он более читаемым будет.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог