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

На курсе системного программного обеспечения, который я веду в этом семестре, нас учат ассемблерам и другому системному программному обеспечению. Читая курс, я наткнулся на тему LITERALS.

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

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


person Crystal Meth    schedule 05.03.2014    source источник
comment
Процессор ничего не знает о литералах, он поддерживает только непосредственные операнды и указатели на память. Литералы — это функция ассемблера или компилятора. То, как литеральное значение используется в исполняемой программе, определяется контекстом, в котором вы его используете.   -  person Hans Passant    schedule 05.03.2014


Ответы (1)


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

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

Но вам может понадобиться поместить литеральные значения в структуры данных или таблицы, которые может использовать ваша программа. Вы используете ассемблерные «псевдо-операции», которые объявляют хранилище для этого:

          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

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

person Ira Baxter    schedule 05.03.2014
comment
Итак, это означает, что преимущество использования литералов заключается в том, что они способны хранить большие данные, такие как строки, которые нельзя хранить в непосредственных операндах? - person Crystal Meth; 05.03.2014
comment
Литералы — это последовательности символов, которые самоидентифицируют свое значение, например, 17 и abc. Непосредственные операнды — это способы встраивания литеральных значений непосредственно в машинные инструкции. Когда буквальное значение не подходит, а оно вам нужно, вы должны поместить его в другое место (например, в контроллер домена) и сослаться на него, используя адрес этого места в другом месте (обычно метку), и вы часто можете сделать это путем написания имени метки в том месте, где в инструкции разрешено непосредственное значение. - person Ira Baxter; 05.03.2014