Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler (Уч_пос_Лаб_Ч1).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.43 Mб
Скачать

П.1.2. Демонстрационные файлы

В данном приложении приводятся файлы, используемые при выполнении заданий к лабораторной работе № 1. Файл hello.exe может быть запущен на исполнение для отработки простого диалога с программой, так и загружен в отладчик TD, для изучения возможностей последнего при отладке ассемблерных программ. Файлы из группы – Mov.asm, Arithmet.asm Logical.asm, LoopCall.asm – демонстрируют применение соответствующей группы команд с использованием различных видов адресации. Поэтому после трансляции их загружают только в TD с целью просмотра форматов машинных команд процессора при изучении принципов их кодирования.

%TITLE "Демонстрационный файл Hello.asm"

IDEAL

MODEL small

STACK 256

DATASEG

Promt DB 'Это время после полудня? (Да/Нет – y/n)$'

GoodMorning DB 13,10,'Доброе утро!',13,10,'$'

GoodAfternoon DB 13,10,'Здравствуйте!',13,10,'$'

CODESEG

Start: mov ax,@data ;Установка в ds адреса сегмента

mov ds,ax ;данных

mov dx,OFFSET Promt ;Сообщение-запрос

mov ah,9 ;Функция Dos вывода сообщения

int 21h ;на экран

mov ah,1 ;Функция Dos ввода символа с

int 21h ;клавиатуры

cmp al,'y' ;y?

jz IsAfternoon ;да, время после полудня

cmp al,'n' ;n?

jz IsMorning ;нет, до полудня

IsAfternoon: mov dx,OFFSET GoodAfternoon ;Указание на "Здравствуйте"

jmp SHORT Disp

IsMorning: mov dx,OFFSET GoodMorning ;Указание на "Доброе утро"

Disp: mov ah,9 ;Функция Dos вывода сообщения на

int 21h ;экран

Exit: mov ax,4C00h ;Функция DOS- выход из программы

int 21h ;Вызов DOS. Останов программы.

END Start ;Конец программы/точка входа

%TITLE "Команды MOV и режимы адресации. Файл mov.asm"

IDEAL

MODEL small

STACK 256

value = 528

DATASEG

b_x DB 1,2,4

w_x DW 8,16,32,64

Label b_var byte

w_var DW 1234h ;Число в памяти: 34h(мл. байт):12h(ст. байт)

CODESEG

Start: mov ax,@data ;Установка в ds адреса

mov ds,ax ;сегмента данных.

;Непосредственная адресация.

mov al,255 ;255=0FFh-беззнаковое число

mov ah,-1 ;[4] ;-1=0FFh-отрицательное число

mov ax,value/5+20 ;[5] ;Загрузка в ах константного выражения

mov bx,offset w_x; ;[6] ;Адрес переменной w_x в bx (bx=0003h)

;Регистровая и прямая адресации. Символьная переменная, заключённая в квадратные

;скобки (например [b_x]), – выполняет роль адреса этой переменной в памяти

mov dl,al ;[7]

mov al,[b_x] ;В al занести содержимое переменной b_x, т. е. al=b_x[0]=01h.

mov dx,[w_x] ;dx=w_x[0]=0008h.

mov si,[w_var] ;si=1234h

mov al,[b_var] ;al=[b_var]=34h

mov ah,[b_var+1] ;ah=[b_var+1]=12h

;Косвенная регистровая.

mov cx,[bx] ;[13] ;cx=w_x[0]=0008h, т.к. bx=offset w_x

mov [word bx],-2 ;[14] ;w_x[0]= -2=0FFFEh.

;Базовая адресация.

mov ax,[bx+2] ;[15] ;ax=w_x[1]=16=0010h.

mov [word bx+2],24 ;[16] ;w_x[1]=24=0018h.

;Индексная адресация.

mov si,1

mov al,[si+b_x] ;[18] ;al=[b_x+1]=02h.

;Базово индексная адресация.

inc si ;si=2

mov bx,1 ;bx=2

mov ax,[bx+si+w_x] ;[21] ;ax=[4+w_x]=32=0020h.

mov [word bx+si+w_x],128 ;[22] ;w_x[2]=128=0080h.

;Применение команды lea

lea bx,[w_x+si] ;[23] ;bx=offset w_x+si=offset w_x[1]=005h.

Exit: mov ax,4C00h ;Функция DOS- выход из программы.

int 21h ;Вызов DOS. Останов

END Start ;Конец программы/точка входа.

%TITLE "Команды сложения, умножения и деления. Файл arithmet.asm"

IDEAL

MODEL small

STACK 256

DATASEG

op_1 DD 11112222h

op_2 DD 3333DDDEh

b_dst DB 32 ;20h

b_src DB 64 ;40h

w_src DW 512 ;200h

CODESEG

Start: mov ax,@data ;Установка в ds адреса

mov ds,ax ;сегмента данных.

;Сложение операндов из двойных слов.

mov di,offset op_1

mov si,offset op_2

mov ax,[di] ;Low(op_1)ax.

add ax,[si] ;[6] ;Low(op_1)+Low(op_2)=Low(sum).

mov [di],ax ;Сохранение Low(sum).

mov ax,[di+2] ;High(op_1)ax.

adc ax,[si+2] ;[9] ;High(op_1)+High(op_2)+cf=High(sum).

mov [di+2],ax ;Сохранение High(sum).

;Умножение и деление.

mov al,[b_dst] ;al=32=20h.

Push al

mul [b_src] ;[13] ;ax al*[b_src]- беззнаковое умножение: "8*8=16"

neg [b_src] ;[14] ;[b_src]0-[b_src]

pop al

imul [b_src] ;[16] ;ax al*[b_src]- знаковое умножение: "8*8=16"

idiv [b_src] ;[17] ;{al= Quot (ax/[b_src]), ah=Rem (ax/[b_src])} – знако-

;вое деление: "16:8=8"

cbw ;alax (со знаком). В данном случае ax0

mul [w_src] ;[19 ] ;dx:axax[w_src]- беззнаковое умножение: "16*16=32"

idiv [w_src] ;[20 ] ;{axQuot (dx.ax/w_src), dxRem (dx.ax/w_src)} –

;знаковое деление в формате: "32:16=16". Так как операнды положительные, то такой же

;результат можно было бы получить и с помощью команды div

Exit: mov ax,4C00h ;Функция DOS -выход из программы.

int 21h ;Вызов DOS. Останов.

END Start ;Конец программы/точка входа.

%TITLE "Логические команды и команды сдвига. Файл logical.asm"

IDEAL

MODEL small

STACK 256

DATASEG

source DW 0ABh

w_mask DW 0F0h

oper DB 0AAh ;176

CODESEG

Start: mov ax,@data ;Установка в ds адреса сегмента

mov ds,ax ;данных.

mov ax,[source] ;Занести в ax,bx,cx, [source]=0ABh

mov bx,ax

mov cx,ax

;Стандартное применение логических команд

and ax,[w_mask] ;[6] ;Стирание соответствующих битов

or bx,[w_mask] ;[7] ;Установка соответствующих битов в "1"

xor cx,[w_mask] ;Инвертирование соответствующих битов

xor bx,bx ;bx=0. Гашение регистра

;Циклические сдвиги.

rol [oper],1 ;[10] ;[oper]=55, cf=1.

ror [oper],1 ;[oper]=AA, cf=1.

rcl [oper],1 ;[12] ;[oper]=55, cf=1.

rcr [oper],1 ;[oper]=AA, cf=1.

;Нестандартное применение – быстрое деление положительного числа сдвигами вправо.

mov al,0Eh ;al=0Eh=14

sar al,1 ;[15] ;al=07 ,cf=0,

sar al,1 ;al=03 ,cf=1,

sar al,1 ;al=01 ,cf=1,

sar al,1 ;al=00 ,cf=1.

;Быстрое умножение сдвигами влево положительного числа: A=10*x=(4+1)*2*x; x=al.

mov al,2 ;al=2

mov bl,al

sal al,1 ;[21] ;*2,

shl al,1 ;*4,

add al,bl ;*(4+1),

shl al,1 ;*10, al=10*x=20=14h.

Exit: mov ax,4C00h ;Функция DOS -выход из программы.

int 21h ;Вызов DOS. Останов.

END Start ;Конец программы/точка входа.

%TITLE "Цикл с подпрограммой. Файл LoopCall.asm"

;В программе демонстрируется организация цикла на основе команды Loop в процессе деле-

;ния каждого элемента массива Array на постоянное число с использованием соответствую-

;щей процедуры Divide

IDEAL

MODEL small

STACK 256

DATASEG

Array DB 20,25,30,35,40

LengArray = $-Array ;длина строки

CODESEG

Start: mov ax,@data ;Установка в ds адреса сегмента

mov ds,ax ;данных.

mov si,offset Array

mov cx,LengArray

L1: mov al,[si] ;alтекущий элемент строки.

call Divide ;[6] ;Выполнение процедуры деления на 5.

mov [si],al

inc si

loop L1 ;[9] ;Повторить сх раз

Exit: mov ax,4C00h ;Функция DOS -выход из программы.

int 21h ;Вызов DOS. Останов.

;Подпрограмма деления Divide на 5. Вход: al-значение, предназначенное для деления.

;Выход: al-результат деления.

PROC Divide near ;Оператор near можно не указывать, т.к. модель

;памяти Small предполагает все переходы близкими

push bx

xor ah,ah ;Подготовка ah:al как 16-битовое

mov bl,5 ;делимое, а bl- 8-битовый делитель.

div bl ;al<quot(ax/bl), ah<-rem(ax/bl)

pop bx

ret ;[18] ;Возврат из процедуры

ENDP Divide

END Start ;Конец программы/точка входа.

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