П.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: axax*[w_src]- беззнаковое умножение: " 16*16=32" idiv [w_src]; [20 ]; {axQuot (dx.ax/w_src), dxRem (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; Конец программы/точка входа.
|