2012-04-12 2 views
0

Может ли кто-нибудь объяснить мне, что делает следующий фрагмент кода сборки? Я не совсем уверен, что делает последняя строка.Объяснение для сборки

.def main = r16 

.equ O = 5 
.equ P = 6 

ldi main, 0 
ldi r16, (1<<O) | (1<<P) 

Im особенно интересно, что на самом деле делает последняя строка. Загружает ли регистр 16 значение двух логических shifs слева после инструкции OR?

Спасибо большое.

ответ

1

(1<<O) | (1<<P) - выражение, оцениваемое ассемблером, результат которого (в данном случае 96) заменяется в конечном машинный код.

+0

Спасибо за ваш ответ, но им больше интересно, что он на самом деле делает, как я сказал в своем открытии. Мне просто интересно, что такое «<<» и «|» означает в сборе. – Brainscrewer

+0

<< и | не являются языком ассемблера, они больше относятся к языку C. «язык ассемблера» здесь ldi r16,96. Как определение в C................................................... Таким образом, O - это определение для числа 5, 1 << 5 означает 1 сдвинутый левый 5 бит или 0x20. P определяется как 6, 1 << 6 означает 1 сдвинутый левый 6 или 0x40. | означает или два значения, поэтому 0x20 | 0x40 = 0x60, что равно 96 десятичным. –

+0

a определяет часть языка C, да. но на ассемблере директивы специфичны для ассемблера, программа, которая преобразует файл языка ассемблера в машинный код. И часто бывает так, что разные ассемблеры для одного и того же процессора не используют все те же директивы. и когда вы делаете что-то подобное с C-кодом, иногда сам ассемблер не может его обрабатывать (например, gnu-ассемблер), вам иногда приходится предварительно обрабатывать его с помощью компилятора C, а затем передать его ассемблеру. –

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