Поиск по сайту:
В данном приложении приводятся файлы, используемые при выполнении заданий к лабораторной работе № 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 ;Конец программы/точка входа.