Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по ОС мои.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
2.82 Mб
Скачать
  1. Ассемблерные команды умножения, деления и изменения знака. Пример программы.

Команда mul выполняет умножение целого без знакового числа, находящегося в регистре EAX(AX, AL) на операнд-источник (целое число со знаком). Размер произведения в два раза больше размера сомножителей.

Для однобайтовых операций один из сомножителей помещается в регистр AL. После проведения операции умножения результат записывается в регистр AX.

Для двухбайтовых операций один из сомножителей помещается в регистр AX. После проведения операции умножения результат записывается в регистры DX:AXDX- старшая часть, в AX- младшая).

Для четырехбайтовых операций один из сомножителей помещается в регистр EAX. После проведения операции умножения результат записывается в регистры EDX:EAXEDX- старшая часть, в EAX- младшая).

В качестве второго операнда (источника) можно указывать регистр данных или ячейку памяти; не допускается умножение на непосредственное значение.

Команда imul выполняет умножение целого знакового числа, находящегося в регистре EAX(AX, AL) на операнд-источник (целое число со знаком). Алгоритм тот же.

Команда div выполняет деление целого числа без знака, находящегося в регистре AX (в случае деления на байт), в DX:AX (в случае деления на слово) или в регистрах EDX:EAX (в случае деления на двойное слово). Размер делимого в два раза больше размера делителя и остатка.

Для однобайтовых операций делимое помещается в регистр AX. После проведения операции деления частное записывается в регистр AL, а остаток – в регистр AH.

Для двухбайтовых операций делимое помещается в регистры DX:AXDX- старшая часть, в AX- младшая). После проведения операции деления частное записывается в регистр AX, а остаток – в регистр DX.

Для четырехбайтовых операций делимое помещается в регистры EDX:EAXEDX- старшая часть, в EAX- младшая). После проведения операции деления частное записывается в регистр EAX, а остаток – в регистр EDX.

В качестве второго операнда (делителя) можно указывать регистр данных или ячейку памяти; не допускается деление на непосредственное значение.

Команда idiv выполняет деление целого числа со знаком, находящегося в регистре AX (в случае деления на байт), в DX:AX (в случае деления на слово) или в регистрах EDX:EAX (в случае деления на двойное слово) на операнд-источник (целое число со знаком). Алгоритм тот же.

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

В качестве операнда можно указывать регистр данных или ячейку памяти. Не допускается использовать в качестве операнда непосредственное значение.

Пример:

mypr proc

mov al,05h

mov dl,02h

mul dl

int 21h

mypr endp

end mypr

В регистре ax будет произведение al и dl.

  1. Использование в Delphi встроенного ассемблера. Пример программы.

Зарезервированное слово ASM открывает доступ к средствам встроенного ассемблера. Этот оператор располагается только внутри исполняемой части приложения.

Область действия оператора ASM ограничивается ближайшим по тексту зарезервированным словом END:

ASM

<одна или несколько команд встроенного ассемблера>

END;

На рисунке приведен пример программы работы с ассемблерными вставками.

Ассемблерная вставка увеличивает на 2 исходное число.

Программный код для события OnClick кнопки «Ассемблерные вставки» имеет следующий вид:

procedure TForm1.Button1Click (Sender: TObject);

Var x:Integer;

begin

x:=StrToInt(Edit1.Text);

asm

mov ax,word ptr x

add ax,2

mov word ptr x,ax

end;

Edit2.Text:=IntToStr(x);

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]