2014-09-12 3 views
-1

У меня есть несколько примеров, которые довольно просты, за исключением концепции LABEL. Пример 1 добавляет 25 10 раз сам по себе, тогда как пример 2 принимает дополнение к регистру A 700 раз.«Ярлык» на языке ассемблера

Example-1: MOV A,#0 
       MOV R2,#10 
AGAIN:  ADD A,#25 
       DJNZ R2,AGAIN 
       MOV R5,A 

Example-2: 
       MOV A,#55H 
       MOV R3,#10 
NEXT:   MOV R2,#70 
AGAIN:  CPL A 
       DJNZ R2,AGAIN 
       DJNZ R3,NEXT 

Я не могу понять концепцию LABEL. В примере-1, когда запускается первая программа времени, A получает значение 25, а затем, когда R2 уменьшается с 10 на 1, выход составляет 275 вместо 250. Но если я предполагаю, что LABEL обходит, если он не вызван, тогда все в порядке и я получаю результат 250. Но если я принимаю одно и то же (минуя LABEL в пошаговом исполнении) в примере-2, то LABEL NEXT будет обходить. И «DJNZ R2, AGAIN» будет исполнен. Поскольку NEXT был обойден, тогда как R2 получит значение # 70? Поэтому мой вопрос касается выполнения LABEL. Являются ли LABELS выполненными или обходимыми?

+1

«ЛАБОРАТОРИЯ» - это то, что вам не нужно вручную настраивать адреса для перехода. Это * не * инструкция и не занимает места (за исключением того, что ассемблер может выровнять код, чтобы сделать его действительным). – user2864740

+0

Этикетка не является чем-то, что вы обходите или нет - это просто символическое имя для адреса, где расположена следующая инструкция. Вы можете добавить ярлык перед каждой строкой без удара - если вы не используете его для перехода к нему или для его вызова. –

+0

Справа. Затем в примере-1, когда запускается 1-я программа времени, команда добавления добавляет 25 в A, а когда 10 раз DJNZ добавляет 25 в A, она должна выйти до 275. Но в примере ответ получается 250. Как это? –

ответ

0

и когда в 10 раз DJNZ добавляет 25 в А он должен выйти, чтобы быть 275

Нет, 250 правильный ответ. После 10-инструкции добавить, зарегистрировать R2 все еще содержит 1 - это то получает декрементируется до 0 и затем инструкцию DJNZ не перехода к метке больше, но переходит к следующей инструкции.

Вы можете рассматривать DJNZ как две команды, аналогичные

DEC R2 
JNZ AGAIN ; NOTE: 8051 does not have a Zero flag - would need to 
       ; use ACC for that, so treat this as pseudo code! 

Вы можете использовать тренажер как http://www.edsim51.com/ пошагово инструкции и смотреть, как регистры изменяются для каждого шага. Это очень полезно для изучения поведения конкретных инструкций.

0

Ярлык не обходит ... Если вы посмотрите на работу цикла, то u увидит, что первый DJNZ уменьшает значение регистра, а если результат не равен нулю, он выполняет lablel. В первом примере, начиная сверху: 1) A получает ноль, то 2) R2 получает 10, затем 3) A получает 25, затем 4) DJNZ уменьшает значение R2, создавая его 9, а так как результат не равен нулю, выполняет AGAIN и добавляет 25 в A, делая его 50 и т. д .... когда значение R2 достигает 1, DJNZ уменьшает его, а результат равен нулю, поэтому он не будет запускать AGAIN. Следовательно, DJNZ выполняется 9 раз, поэтому получается результат 25 * 9 = 225. Но поскольку 25 было сохранено в A до выполнения цикла DJNZ, результат равен 250 ... Надеюсь, это поможет вам.

+0

, пожалуйста, отредактируйте свой ответ и исправьте новые строки (вы можете использовать тег
). –