Литералы против непосредственных операндов
На курсе по системному программному обеспечению, который у меня есть в этом семестре, нас обучают ассемблеры и другое системное программное обеспечение. Читая через курс, я наткнулся на тему ЛИТЕРАТУРЫ.
Было сравнение между литералами и непосредственными операндами, которые сказали, что единственное различие между ними состоит в том, что литералы не собраны как часть инструкции, тогда как непосредственные операнды есть.
Почему мы должны использовать литералы, если мы можем использовать непосредственные операнды? Чем они отличаются? Другими словами, когда использовать литералы, а когда использовать непосредственные операнды?
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
Ваш синтаксис ассемблера может отличаться от этого, но принципы остаются теми же.