Курс, 4 семестр, 51 час Лекции Саратов 2007 Часть Системное программное обеспечение 3 - страница 9

^ 3.4.Вспомогательные команды для целочисленных операций
В системе команд микропроцессора есть несколько команд, которые могут облегчить программирование алгоритмов, производящих арифметические вычисления. В них могут возникать различные проблемы, для разрешения которых разработчики микропроцессора предусмотрели несколько команд. Рассмотрим их в следующем разделе.
^ 3.4.1.Команды преобразования типов
Что делать, если размеры операндов, участвующих в арифметических операциях, разные? Например, предположим, что в операции сложения один операнд является словом, а другой занимает двойное слово. Выше сказано, что в операции сложения должны участвовать операнды одного формата. Если числа без знака, то выход найти просто. В этом случае можно на базе исходного операнда сформировать новый (формата двойного слова), старшие разряды которого просто заполнить нулями. Сложнее ситуация для чисел со знаком: как динамически, в ходе выполнения программы, учесть знак операнда? Для решения подобных проблем в системе команд микропроцессора есть так называемые команды преобразования типа. Эти команды расширяют байты в слова, слова — в двойные слова и двойные слова — в учетверенные слова (64-разрядные значения). Команды преобразования типа особенно полезны при преобразовании целых со знаком, так как они автоматически заполняют старшие биты вновь формируемого операнда значениями знакового бита старого объекта. Эта операция приводит к целым значениям того же знака и той же величины, что и исходная, но уже в более длинном формате. Подобное преобразование называется операцией распространения знака.

Существуют два вида команд преобразования типа:

К примеру, вычислим значение y = (a + b)/c, где a, b, c — байтовые знаковые переменные (листинг 7).

 Листинг 7. Вычисление простого выражения

;prg_8_9.asm

masm

model small

stack 256

.data

a db ?

b db ?

c db ?

y dw 0

.code

main: ;точка входа в программу

...

xor ax,ax

mov al,a

cbw

movsx bx,b

add ax,bx

idiv c ;в al — частное, в ah — остаток

exit:

mov ax,4c00h ;стандартный выход

int 21h

end main ;конец программы

В этой программе делимое для команды idiv (строка 17) готовится заранее. Так как делитель имеет размер байта, то делимое должно быть словом. С учетом этого сложение осуществляется параллельно с преобразованием размера результата в слово (строки 13–16). Для примера расширение операндов со знаком производится двумя разными командами — cbw и movsx.
^ 3.4.2.Другие полезные команды
xadd назначение,источник — обмен местами и сложение.

Команда позволяет выполнить последовательно два действия:

neg операнд — отрицание с дополнением до двух.

Команда выполняет инвертирование значения операнд. Физически команда выполняет одно действие:

операнд = 0 – операнд, то есть вычитает операнд из нуля.

Команду neg операнд можно применять:

Дело в том, что команды sub и sbb не позволяют вычесть что-либо из константы, так как константа не может служить операндом-приемником в этих операциях. Поэтому данную операцию можно выполнить с помощью двух команд:

neg ax ;смена знака (ax)

...

add ax,340 ;фактически вычитание: (ax)=340-(ax) 

1426589658093057.html
1426720130100800.html
1426796141670666.html
1426893981347598.html
1427051202629598.html