Цель: Получить эту сборку код:Преобразование мелких деталей от С до x86 Ассамблеи
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
movl $-559038737, -16(%ebp)
movl $0, -12(%ebp)
movl $1, -8(%ebp)
jmp .L2
.L3:
movl -8(%ebp), %eax
andl -16(%ebp), %eax
testl %eax, %eax
setne %al
movzbl %al, %eax
addl %eax, -12(%ebp)
sall -8(%ebp)
.L2:
cmpl $0, -8(%ebp)
jne .L3
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
путем заливки в заготовке:
#include <stdio.h>
int main()
{
int x = 0x________;
int result = ______;
int mask;
for (mask = _________; mask _______; mask = ________) {
result += ________;
}
}
Что я получил:
#include <stdio.h>
int main()
{
int x = 0xFFFFFFFFDEADBEEF;
int result = 0;
int mask;
for (mask = 1; mask != 0; mask = mask + 1)
{
result += x & mask;
}
}
мой код сборки:
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $-559038737, -4(%ebp)
movl $0, -12(%ebp)
movl $1, -8(%ebp)
jmp .L2
.L3:
movl -8(%ebp), %eax
movl -4(%ebp), %edx
andl %edx, %eax
addl %eax, -12(%ebp)
sall -8(%ebp)
.L2:
cmpl $0, -8(%ebp)
jne .L3
leave
ret
Я застрял на этом несколько часов: как мне добавить этот код на C, чтобы он использовал команды testl, setne, and movzbl
? Я знаю, что testl проверяет, что оба операнда равны 0, но я не уверен, где это вписывается в контекст программы C. Кроме того, что такое addl $16, %esp
в нижней части основного? Просто еще раз указав на стопку стека?
Объясните, какие тесты, setne и movbl означают для нас. когда вы это сделаете, вы можете лучше понять, что вам нужно сделать в c. у вас есть правильное объяснение движения esp - он раскручивает фрейм стека, который должен был содержать автоматические переменные. –
Тройка 'test eax, eax \ setne al \ movzx eax, al' примерно означает' something! = 0' в C, который затем используется как значение (вы не должны видеть этот шаблон, если это сравнение используется как условие для отделение). – harold