2015-11-04 2 views
2

У меня возникли некоторые проблемы с пониманием некоторых частей кода сборки я полагаю, чтобы расшифровывать в петлюКод сборки петли?

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.

Звучит ли это правильно?

+0

Существует довольно распространенный набор обозначений, который работает так. ** EAX ** - это 32-разрядный регистр A. ** RAX ** - 64-бит. Просто ** AX ** - 16 бит, который разбивается на 8-бит ** AH ** (высокий) и ** AL ** (низкий). Все эти примеры используют регистр «A», но он распространяется и на другие регистры одинаково (EBX, RBX, BH и т. Д.). –

+0

@ Two-BitAlchemist Итак, что-то делает с нижними битами беззнакового n, который прошел? – user3483844

+0

Я не делал сборку с колледжа, и я узнал об этом на [NASM] (http://www.nasm.us/), который выглядит немного по-другому, поэтому возьмите это с соответствующим количеством соли, но мне кажется, 'testb' - это 1-байтная (8-разрядная) версия команды' test', и она используется только для последних 8 бит 'EAX'. –

ответ

1

%al является l owest байт регистра %eax, который где вы определили, что n в настоящее время хранится (на основе вашей интерпретации cmpl $1, %eax).

+0

Итак, как бы вы могли получить доступ к% al части n, используя код C? Кажется, у меня это есть. Параметр while проверяет, если n больше 1, и если это так, мы делаем оператор if с младшими битами, и если true, то мы немного сдвигаемся вправо или делаем leal 1 (% eax,% eax, 2), который is ... something – user3483844

+0

Посмотрите на термин * бит-маска *: идея состоит в том, чтобы обнулить биты, которые вам не интересны, поэтому вы можете протестировать весь регистр (или, в вашем случае, переменную). –

Смежные вопросы