Поиск по сайту:


«Assembler IBM PC П.1.2. Демонстрационные файлы»

Файл: 4 КБ
Поделиться:

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