Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Листинг Копирование строки



<1>; - Prg.asm -

<2> masm

< 3 > model small

<4>.data

<5>...

<6> str_l db "Ассемблер - базовый язык компьютера"

<7> str_2 db 35 dup (" ")

<8> full_pnt dd str_l

<9>...

<10>.code

<11> start:

<12> ….

<13> lea si,str_l;загружаются значения эффективных адресов переменных

<14> lea di,str_2;загружаются значения эффективных адресов переменных

<15> les bx,full_pnt;полный указатель на str_l в пару es:bx

<16> mov сx, 35;счетчик цикла для loop ml

<17> ml:

<18> mov al, [si]; пересылка очередного байта из одной строки в другую

<19> mov [di],al; пересылка очередного байта из одной строки в другую

<20> inc si

<21> inc di

<22> loop m1;цикл на метку ml до пересылки всех символов

<23>..........

<24> end start

51. Ассемблерные команды для работы со стеком. Пример программы.

Стек — это область памяти, специально выделяемая для временного хранения дан­ных программы. Важность стека определяется тем, что для него в структуре про­граммы предусмотрен отдельный сегмент. На тот случай, если программист забыл описать сегмент стека в своей программе, компоновщик tlink выдаст предупрежда­ющее сообщение.

Для работы со стеком предназначены три регистра:

Размер стека зависит от режима работы процессора и ограничивается значени­ем 64 Кбайт (или 4 Гбайт в защищенном режиме). В каждый момент времени дос­тупен только один стек, адрес сегмента которого содержится в регистре SS. Этот стек называется текущим. Для того чтобы обратиться к другому стеку («переклю­чить стек»), необходимо загрузить в регистр SS другой адрес. Регистр SS автомати­чески используется процессором для выполнения всех команд, работающих со сте­ком.

Еще некоторые особенности работы со стеком:

· Запись и чтение данных в стеке осуществляются в соответствии с принципом LIFO (Last In First Out — «последним пришел, первым ушел»).

· По мере записи данных в стек последний растет в сторону младших адресов. Эта особенность заложена в алгоритм команд работы со стеком.

· При использовании регистров ESP/SP и ЕВР/ВР для адресации памяти ассемблер автоматически считает, что содержащиеся в нем значения представляют собой смещения относительно сегментного регистра SS.

Для организации работы со стеком существуют специальные команды записи и чтения:

Команда PUSH выполняет запись значения <источник> в вершину стека: push <источник>

Алгоритм работы этой команды включает два действия:

1. Значение SP уменьшается на 2: (SP) = (SP) - 2

2. Значение источника записывается по адресу, указываемому парой SS:SP

Команда POP выполняет запись значения из вершины стека по месту, указанно­му операндом <приемник> (значение при этом «снимается» с вершины стека): pop <приемник>

Алгоритм работы команды POP обратен алгоритму команды PUSH:

1. Запись содержимого вершины стека по месту, указанному операндом <приемник>.

2. Увеличение значения SP: (SP) = (SP) + 2

Команда PUSHA предназначена для групповой записи в стек. По этой команде в стек последовательно записывается содержимое регистров АХ, СХ, DX, BX, SP, BP, SI, DI. Заметим, что записывается оригинальное содержимое SP, то есть то, которое было до выдачи команды PUSHA.

Пример, рассмотрим фрагмент программы для пересылки бай­та из ячейки fls в ячейку fld:

masm

model small

.data

fls db 5

fld db?

.code

start:

…..

push fls;поместить значение в стек

pop fld;записать из стека

end start

52. Ассемблерные команды сложения и вычитания. Пример программы.

Команда inc прибавляет единицу к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака.

Команда add выполняет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти. В качестве второго операнда можно указывать регистр (кроме сегментного), ячейку памяти или непосредственное значение. Однако, не допускается определять одновременно оба операнда как ячейки памяти. Операнды могут быть числами со знаком или без знака.

Команда adc выполняет сложение первого и второго операндов, прибавляя к результату значение флага переноса CF. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти. В качестве второго операнда можно указывать регистр (кроме сегментного), ячейку памяти или непосредственное значение. Однако, не допускается определять одновременно оба операнда как ячейки памяти. Операнды могут быть числами со знаком или без знака.

Команда dec вычитает единицу из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака.

Команда sub вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется, замещаясь результатом вычитания. Второй операнд не изменяется.

Команда sbb вычитает второй операнд (источник) из первого (приемника). Результат замещает первый операнд, предыдущее значение которого теряется. Если установлен флаг CF, из результата вычитается еще 1. Второй операнд не изменяется.

Пример:

mypr proc

mov ax,05h

mov dx,10h

mov bx,0

add bx, ax

add bx, dx

int 21h

mypr endp

end mypr

В регистре bx будет сумма ax и dx.

53. Ассемблерные команды умножения, деления и изменения знака. Пример программы.

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

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

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

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

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

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

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

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

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

Для четырехбайтовых операций делимое помещается в регистры EDX:EAX (в EDX- старшая часть, в 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.

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

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

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

ASM

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

END;





Дата публикования: 2014-11-03; Прочитано: 885 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.012 с)...