У меня возникли некоторые проблемы с пониманием некоторых частей кода сборки я полагаю, чтобы расшифровывать в петлюКод сборки петли?
prob2:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
cmpl $1, %eax
je .L1
.L6:
testb $1, %al
je .L3
leal 1(%eax,%eax,2), %eax
jmp .L4
.L3:
shrl %eax
.L4:
cmpl $1, %eax
jne .L6
.L1:
popl %ebp
ret
Сейчас мне дают общее представление о коде C
void prob2(unsigned n)
{
while (________________) {
if (_______________) {
______________;
} else {
_______________;
}
}
}
Я понял, что цикл while проверяет, есть ли n < 1, но в следующей части if-else я смущен относительно того, что такое% al. Я предполагаю, что это тестирование, чтобы убедиться, что оно равно 1, и если оно (это никогда не будет, потому что цикл while прерывается, когда n = 1), то он сдвигает n вправо байтом, иначе он выполняет левую часть и сравнивает чтобы убедиться, что он еще не равен 1.
Звучит ли это правильно?
Существует довольно распространенный набор обозначений, который работает так. ** EAX ** - это 32-разрядный регистр A. ** RAX ** - 64-бит. Просто ** AX ** - 16 бит, который разбивается на 8-бит ** AH ** (высокий) и ** AL ** (низкий). Все эти примеры используют регистр «A», но он распространяется и на другие регистры одинаково (EBX, RBX, BH и т. Д.). –
@ Two-BitAlchemist Итак, что-то делает с нижними битами беззнакового n, который прошел? – user3483844
Я не делал сборку с колледжа, и я узнал об этом на [NASM] (http://www.nasm.us/), который выглядит немного по-другому, поэтому возьмите это с соответствующим количеством соли, но мне кажется, 'testb' - это 1-байтная (8-разрядная) версия команды' test', и она используется только для последних 8 бит 'EAX'. –