Литералы против непосредственных операндов

На курсе по системному программному обеспечению, который у меня есть в этом семестре, нас обучают ассемблеры и другое системное программное обеспечение. Читая через курс, я наткнулся на тему ЛИТЕРАТУРЫ.

Было сравнение между литералами и непосредственными операндами, которые сказали, что единственное различие между ними состоит в том, что литералы не собраны как часть инструкции, тогда как непосредственные операнды есть.

Почему мы должны использовать литералы, если мы можем использовать непосредственные операнды? Чем они отличаются? Другими словами, когда использовать литералы, а когда использовать непосредственные операнды?

1 ответ

Решение

Непосредственные операнды - это буквальные значения, которые вы можете закодировать в самих инструкциях, например:

          MOV   R1,  17  ; move 17 as a value to R1

Но вам может потребоваться поместить буквенные значения в структуры данных или таблицы, которые может использовать ваша программа. Для этого вы используете ассемблер "psuedo-ops", который объявляет хранилище:

          DW      17     ; define a word containing the literal 17

Некоторые литералы, особенно текстовые строки, почти никогда не помещаются в непосредственное поле (недостаточно битов в непосредственном поле), поэтому на самом деле не могут быть включены в вашу программу в качестве значений, непосредственных для инструкций:

    XYZ    DC       "I am a duck."

Когда это происходит, вы обычно найдете инструкции, которые ссылаются на объявленные данные через их метку как неявное непосредственное значение, которое не является литералом:

           MOV    R1, XYZ

Исключением является чрезвычайно короткий строковый литерал:

           MOV    R1,  "A"

Это на самом деле не отличается от неявного литерала в операторе вызова:

           CALL   FOO

что относится к метке на коде FOO:

     FOO:  MOV   R1, 17
           RETURN

Ваш синтаксис ассемблера может отличаться от этого, но принципы остаются теми же.

Другие вопросы по тегам