Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
29
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

4) Нельзя использовать сегментный регистр cs в качестве операнда назначения.

5) Оператор ptr можно применять и когда требуется принудительно поменять размерность операндов. К примеру, требуется переслать значение 0ffh во второй байт поля flp:

.data

flp dw ?

.code

start:

----

mov byte ptr (flp+1),0ffh

----

end start

Для двунаправленной пересылки данных применяют команду xchg. Эту же операцию можно выполнить применив последовательность из нескольких команд mov. Общий вид записи:

XCHG <операнд1>, <операнд2>

Содержимое операнда2 копируется в операнд1, а старое содержимое операнда1 — в операнд2. XCHG можно выполнять над двумя регистрами или над регистром и переменной.

Например:

Xchg eax,ebx ; обменять содержимое регистров eax и ebx.

То же, что три команды на языке С:

temp = eax;

eax = ebx;

ebx = temp;

Xchg al,al ; а эта команда не делает ничего

Xchg ax, word ptr [si] ; обменять содержимое регистра ах и слова в памяти по адресу в [si].

22. Відмінності програми, написаної для DOS16 та для Win32. Арифметичні команди. Випадки при яких виникає переповнення результату ділення. Способи, що позволяють виконати ділення навіть при виникненні переповнення результату ділення.

Программирование арифметических выражений в языке Ассемблер происходит через некоторые команды такие, как:  mul, div, sub, add. Эти команды называются командами арифметических операций.

Mul – команда умножения. Она умножает регистр ax на то, что стоит после нее. Результат заносится в ax.  Div – команда деления. Она делит регистр axна то, что стоит после нее. Результат заносится в ax.  Add – команда сложения. Слаживает два числа. Результат заносится в первый регистр. Sub – команда вычитания. Вычитает два числа. Результат заносится в первый регистр.

Пример: Написать программу на ассемблере вычисления выражения: а – e/b – de;  где а =5b =27c = 86е =1986;  d =1112;  Результат вычисления выражения сохранить в памяти. Навести значение и порядок размещения данные в памяти.

 Текст программы

.686            ; директива определения типа микропроцессора  .model flat,stdcall          ; задание линейной модели памяти  ; но соглашения ОС Windows

.data                  ; директива определения данные  _a dw 5           ; запись в 16-разрядный амбарчик памяти с именем _а числа 5  _b dw 27    ; запись _b = 16h  _c dw 86    ; запись _c = 56h  _e dw 1986        ; запись _e = 7C2h  _d dw 1112        ; запись _d = 458  res dw 0          ; резервирование памяти для сохранения переменной res

.code       ; директива начала сегмента команд  start:  mov edx,0   ; очистка регистров  mov ebx,0   ; очистка регистров  mov ecx,0   ; очистка регистров  mov ах,_e   ; в регистр ах заносим число _e = 7C2h  mul _d      ; множим _e и _d  SHL edx,16  ; делаем здвиг на 16  mov dx,ax  push edx    ; бросаем значение в стек  mov edx,0  mov ах,_e  mov cx,_b  div cx      ; делим ах с cx  pop ecx     ; достаем из стеку значения  sub ecx,eax ; отнимаем mov ах,_a    sub eax,ecx        mov res, eax  ret   ; возвращение управление ОС  end start   ; окончание программы с именем _start

Переполнение результата деления возникает в следующих случаях:

1. Делитель равен 0

2. При делении байтов без знака делимое без знака делимое пол меньшей мере в 256 раз превышает делитель.

3. При делении слов без знака делимое по меньшей мере в 65 536 раз превышает делитель.

4. При делении байтов со знаком частное лежит вне диапазона от –128 до 127 .

5. При делении слов со знаком частное лежит вне диапазона от –32768 до 32767

Коррекция результата

Для того чтобы поучить правильный результат (т.е. выполнить перенос из одного разряда в другой, 56+25= 81, один десяток надо перенести в старший разряд) необходимо его скорректировать. Это делается с помощью следующих команд.

AAA – скорректировать результат сложения для представления в кодах ASCII.

DAA – скорректировать сложение для представления в десятичном формате.

Формат:

AAA

DAA

24. Команда cmp у асемблері. Робота з негативними числами в асемблері при виконанні арифметичних операцій. Значення прапора sf. Приклади встановлення прапора sf при виконанні віднімання В-С. Алгоритм виведення негативних чисел на екран.

Команда cmp выполняет вычитание операторов и устанавливает флаги, не записывает результат вычитания на место первого операнда.

Cmp операнд_1, операнд_2

Опкод

Значение(переход,если...)

Условие

JA

Jump if above (X > Y)

CF=0 & ZF=0

JAE

Jump if above or equal (X >= Y)

CF=0

JB

Jump if below (X < Y)

CF=1

JBE

Jump if below or equal (X < Y)

CF=1 or ZF=1

JC

Jump if carry (cf=1)

CF=1

JCXZ

Jump if CX=0

регистр CX=0

JE (то же, что и JZ)

Jump if equal (X = Y)

ZF=1

JG

Jump if greater (signed) (X > Y)

ZF=0 & SF=OF

JGE

Jump if greater or equal (signed) (X >= Y)

SF=OF

JL

Jump if less (signed) (X < Y)

SF != OF

JLE

Jump if less or equal (signed) (X <= Y)

ZF=1 or SF!=OF

JMP

Безусловный переход

-

JNA

Jump if not above (X <= Y)

CF=1 or ZF=1

JNAE

Jump if not above or equal (X < Y)

CF=1

JNB

Jump if not below (X >= Y)

CF=0

JNBE

Jump if not below or equal (X > Y)

CF=1 & ZF=0

JNC

Jump if not carry (cf=0)

CF=0

JNE

Jump if not equal (X != Y)

ZF=0

JNG

Jump if not greater (signed) (X <= Y)

ZF=1 or SF!=OF

JNGE

Jump if not greater or equal (signed) (X < Y)

SF!=OF

JNL

Jump if not less (signed) (X >= Y)

SF=OF

JNLE

Jump if not less or equal (signed) (X > Y)

ZF=0 & SF=OF

JNO

Jump if not overflow (signed) (of=0)

OF=0

JNP

Jump if no parity (pf=0)

PF=0

JNS

Jump if not signed (signed) (sf=0)

SF=0

JNZ

Jump if not zero (X != Y)

ZF=0

JO

Jump if overflow (signed) (of=1)

OF=1

JP

Jump if parity (pf=1)

PF=1

JP

Jump if parity (pf=1)

PF=1

JPE

Jump if parity even

PF=1

JPO

Jump if parity odd

PF=0

JS

Jump if signed (signed)

SF=1

JZ

Jump if zero (X = Y)

ZF=1

sf

Флаг знака (Sign Flag)

7

1, если старший бит результата равен 1; 0, если старший бит результата равен 0

; Программа формирует массив структур. Массив вводится вручную.

; На экран выводится возраст всех сотрудников

masm

model small

.stack 100h

worker struc ;информация о сотруднике

nam db 15 dup (' ') ;имя

lastnam db 15 dup (' ') ; фамилия

age db 2 dup (' ') ;возраст

worker ends

.data

buf1 db 15 dup (20h)

pole dw ?

pole1 db 2 dup (?) ; поле для вывода возраста

db 0ah,0dh,'$'

count db ?

N=3 ; размерность массива

mas_sotr worker N dup (<>)

mes1 db 'Vvedite 3 elementa strukturi: ','$'

mnam db 10,13,'Vvedite imya: ', '$'

mlastnam db 10,13,'Vvedite familiyou: ','$'

mage db 10,13,'Vvedite vozrast: ','$'

mes db 10,13,'Vozrast=',10,13,'$'

.code

assume ds:@data,es:@data

start:

mov ax,@data

mov ds,ax

xor ax,ax

push ds

pop es

Vvod:

mov dx,offset mes1

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

int 21h

mov cx,N

mov si,0

mov bx, offset mas_sotr

mov ax, type worker

mov dl,0

mul dl

add ax,bx

cld

; Цикл cykl2 – цикл формирования массива структур в памяти.

cykl2:

push cx

mov di,ax

mov pole,ax

mov dx,offset mnam

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

int 21h

lea dx,buf1

mov ah,0ah

int 21h

push si

lea si,buf1

add si,1

mov cl,byte ptr [si]

add si,1

rep movsb

pop si

mov dx,offset mlastnam

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

int 21h

lea dx,buf1

mov ah,0ah

int 21h

push si

lea si,buf1

add si,1

mov cl,byte ptr [si]

mov di,pole

add di,15

add si,1

rep movsb

pop si

mov dx,offset mage

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

int 21h

lea dx,buf1

mov ah,0ah

int 21h

push si

lea si,buf1

add si,1

mov cl,byte ptr [si]

mov di,pole

add di,30

add si,1

rep movsb

pop si

jmp label_1

m1:

loop cykl2

; ----------------------------------------Метка label_1: продолжение цикла cykl2, так как он получается

; очень большим, то часть цикла вынесли за его пределы.

label_1:

pop cx

cmp cx,1

je vivod

inc si

mov ax, type worker

mov dx,si

mul dl

add ax,bx

jmp m1

; -------------------------------------------В конец массива структур записываем конец вывода '$'.

Vivod:

mov byte ptr [di],'$'

mov dx,offset mes

mov ah,9h

int 21h

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

; массива структур в памяти. Далее содержимое поля pole1 выводится на экран.

lea si,mas_sotr

mov bx, type worker

mov ax,0

mov count,al

lea di,pole1

mov cx,3

cykl_vivod:

lea dx,[si].age ;lea dx,[si+1E]

mov si,dx

movsw

mov dx,offset pole1

mov ah,09h

int 21h

lea di,pole1

loop cykl_vivod

mov AX,4C00h

int 21h

end start

Самостоятельно на практике:

1) Переделать программу под WIN32.

2) Создать массив структур mas_sotr2 worker 7 dup (<>). Инициализировать массив структур в программе. На экран выдать сообщение в окне MessageBoxA. Сообщение должно содержать все данные структуры для самого старшего сотрудника.

П

113