Мегаобучалка Главная | О нас | Обратная связь


ASSUME SS:CSeg, DS:CSeg, CS:CSeg



2018-07-06 400 Обсуждений (0)
ASSUME SS:CSeg, DS:CSeg, CS:CSeg 0.00 из 5.00 0 оценок




Org 100h

Start: JMP Main

St1 DB ‘String1’, 13, 10, ‘$’

St2 DB ‘String2’, ‘$’

Main Proc

MOV AH, 9

LEA DX, St1

Int 21h

LEA DX, St2

Int 21h

MOV AH, 4CH

Int 21h

Main endp

CSeg ends

End Start

Model tiny

Code

JMP Met

St1 DB ‘String1’, ‘$’

Met: MOV AH, 09h

LEA DX, St1

Int 21h

MOV AH, 4Ch

Int 21h

End Met

3) --------------------------

Beg Proc

MOV AH, 9

LEA DX, St1

Int 21h

MOV AH, 4Ch

Int 21h

Beg endp

St1 DB ‘String1’, ‘$’

End beg

Замечания:

1. Не каждый исходный файл удовлетворяет требованиям com-файла.

2. Небольшие по объему программы рекомендуется оформлять как com-файлы.

3. Исходный файл, написанный как com-файл, не может быть выполнен как exe-файл.

Арифметические операции:

Сложение (вычитание) беззнаковых чисел выполняется по правилам аналогичным сложению (вычитанию) по модулю 2k принятым в математике. В информатике, если в результате более k разрядов, то k+1-й пересылается в CF.

X + Y = (X + Y) mod2k=X + Y и CF = 0, если X + Y< 2k

X + Y = (X + Y) mod2k=X + Y -2k и CF = 1, если X + Y>= 2k

Пример, работая с байтами, получим:

250 + 10 = (250 + 10) mod 28 = 260 mod 256 = 4

260 = 1 0000 01002, CF = 1, результат - 0000 01002 = 4

X - Y = (X - Y) mod 2k = X – Y и CF = 0, если X>= Y

X - Y = (X - Y) mod 2k = X + 2k –Y и CF = 1, если X < Y

Пример: в байте 1 - 2 = 28 +1- 2 = 257 – 2 = 255, CF = 1

Сложение (вычитание) знаковых чисел сводится к сложению (вычитанию) с использованием дополнительного кода.

X = 10n- |X|

В байте: -1 = 256 – 1 = 255 = 111111112

-3 = 256 – 3 = 253 = 111111012

3 + (-1) = ( 3 + (-1)) mod 256 = (3+255) mod 256 = 2

1 + (-3) = (1 + (-3)) mod 256 = 254 = 111111102

Ответ получили в дополнительном коде, следовательно результат получаем в байте по формуле:

X = 10n- |X| , т.е.

х = 256 – 254 = |2| и знак минус. Ответ -2.

Переполнение происходит, если есть перенос из старшего цифрового в знаковый, а из знакового нет и наоборот, тогда OF = 1. Программист сам решает какой флажок анализировать OF или CF, зная с какими данными он работает.

Арифметические операции изменяют значение флажков OF, CF, SF, ZF, AF, PF.

Сложение в ассемблере:

В Ассемблере команда ‘+’

ADDOP1, OP2; (OP1) + (OP2) ®OP1

ADC OP1, OP2; (OP1) + (OP2) + (CF) ® OP1

XADD OP1, OP2; i486 и>

(OP1) « (OP2) (меняет местами), (OP1) + (OP2) ®OP1

INCOP1; (OP1) + 1 ®OP1

Вычитание в ассемлере:

В Ассемблере команда ‘-‘

SUBOP1, OP2; (OP1) – (OP2) ®OP1

SBB OP1, OP2; (OP1) – (OP2) – (CF) ® OP1

DEC OP1; (OP1) – 1 ® OP1.

Примеры:

X = 1234AB12h, Y = 5678CD34h, X + Y =

MOV AX, 1234h

MOV BX, 0AB12h

MOV CX, 5678h

MOV DX, 0CD34h

ADD BX, DX

ADC AX, CX

X – Y = SUB BX, DX

SBB AX, CX

В командах сложения и вычитания можно использовать любые способы адресации:

ADDAX, mas[SI] ; адресация – прямая с индексированием

SUBDX, mas[BX][DI] ; адресация – по базе с индексированием

ADD CX, 32h

Пример1:

MOV AL, 95h

ADD AL, 82h

95h + 82h = 117h 95 = 100101012 82 = 100000102

100101012 + 100000102 = 1 0001 01112, 10010101

CF = 1, OF = 1, SF = 0, ZF = 0, AF = 0, PF = 1. 10000010

Пример2: 1 00010111

MOV AL, 9h

SUB AL, 5h

9h – 5h = 4h 5 = 00000101 -5 = 11111011 9 = 00001001

9 + (-5) = 11111011 + 00001001 = 1 0000 0100

CF = 1, OF = 0, SF = 0, ZF = 0, AF = 1, PF = 0.

Марта. Лекция 5

Умножение и деление в Ассемблере:

Умножение беззнаковых чисел.

MULOP2; (OP2)*(AL) Ú (AX) Ú (EAX) ®AXÚDX:AXÚEDX:EAX.

Содержимое первого операнда

Содержимое второго операнда умножается на содержимое аккумулятора, то есть регистра AL или AX или EAX, в зависимости от типа операнда. Результат операции может занимать формат удвоенный по сравнению со множителями и пересылается в DX:AX или EDX:EAX в случае

Умножение знаковых чисел.

IMULOP2; аналогично MUL

IMUL OP1, OP2 ;i386 и> IMUL op1, op2, op3 ; i186 и>

OP1 всегда регистр, OP2 – непосредственный операнд, регистр или память.

При умножении результат имеет удвоенный формат по отношению к сомножителям. Иногда мы точно знаем, что результат может уместиться в формат сомножителей, тогда мы извлекаем его из AL, AX, EAX. А если не знаем, то это можно узнать по значению флагов. Размер результата можно выяснить с помощью флагов OF и CF. Если OF = CF = 1, то результат занимает двойной формат, и OF = СF = 0 , результат умещается в формат сомножителей.

Остальные флаги не изменяются.

Деление беззнаковых чисел: Деление знаковых чисел.

DIVOP2; OP2 = rÚm IDIVOP2; OP2 = rÚmОперандом может быть регистр или память.

В этом случае также используется аккумулятор. (AX) Ú (DX:AX) Ú (EDX:EAX) делится на указанный операнд и результат помещается в ALÚAXÚEAX, остаток помещается в AHÚDXÚEDX.

Значение флагов не меняется при делении, но может наступить деление на 0 или переполнение, если 1) op2 = 0, 2) частное не умещается в отведенное ему место. Например:

MOVAX, 600

MOVBH, 2

DIVBH; 600 div 2 = 300 - не умещается в AL.

При использовании арифметических операций необходимо следить за размером операндов.

Пример:

Необходимо цифры целого беззнакового байтового числа N записать в байты памяти, начиная с адреса D как символы. N - (abc)

c = N mod 10

b = (N div 10) mod 10

a = (Ndiv 10) div 10

Перевод в символы: код(i) = код (‘0’) + i

---------------------

NDB ?

DDB 3 Dup (?)

------------------

MOVBL, 10; делитель

MOVAL, N; делимое

MOVAH, 0; расширяем делимое до слова

; или CBWAH конвертируем до слова

DIV BL; A L= ab, AH = c

ADD AH, ‘0’

MOV D+2, AH

MOV AH, 0

DIV BL; AL = a, AH = b

ADD AL, ‘0’

MOV D, AL

ADD AH, ‘0’

MOV D+1, AH

Директивы внешних ссылок:

Директивы внешних ссылок позволяют организовать связь между различными модулями и файлами, расположенными на диске

Public<имя> [, <имя>,…,<имя>]

определяет указанные имена как глобальные величины, к которым можно обратиться из других модулей.<имя> – имена меток и переменных, определенных с помощью директивы ‘=’ и EQU.

Если некоторое имя определено в модуле А как глобальное и к нему нужно обратиться из других модулей В и С, то в этих модулях должна быть директива вида

EXTRN<имя>:<тип> [,<имя>:<тип>…]

Здесь имя то же, что и в Public, а тип определяется следующим образом:

если <имя> – это имя переменной, то типом может быть:

BYTE, WORD, DWORD, FWORD, QWORD, TWORD;

если <имя> – это имя метки, то типом может быть

NEAR, FAR.

Директива EXTRN говорит о том, перечисленные имена являются внешними для данного модуля.

Пример:

В модуле А содержится:

PublicTOT

-------/-------

TOTDW 0;

чтобы обратиться из В и С к имени TOT, в них должна быть директива

EXTRNTOT:WORD

В Ассемблере есть возможность подключения на этапе ассемблирования модулей, расположенных в файлах на диске

INCLUDE <имяфайла>

Пример:

INCLUDE С:\WORK\Prim.ASM

Prim.ASM, расположенный в указанной директории, на этапе ассемблирования записывается на место этой директивы.

Команды управления:

Команды управления позволяют изменить ход вычислительного процесса. К ним относятся команды безусловной передачи управления, команды условной передачи управления, команды организации циклов.

Команды безусловной передачи управления имеют вид

JMP<имя>,

где имя определяет метку команды, которая будет выполняться следующей за этой командой. Эта команда может располагаться в том же кодовом сегменте, что и команда JMP или в другом кодовом сегменте.

JMPM1; по умолчанию М1 имеет тип NEAR (то есть является ближней меткой)

Если метка содержится в другом сегменте, то в том сегменте, в который передается управление, должно быть PublicM1, а из которого – EXTRNM1: FAR.

Кроме того, передачу можно осуществлять с использованием прямой адресации (JMPM1) или с использованием косвенной адресации (JMP [BX]).

Команда, осуществляющая близкую передачу, занимает 3 байта, а дальняя – 5 байтов. А если передача осуществляется не далее как на -128 или 127 байтов, то можно использовать команду безусловной передачи данных, занимающую 1 байт, с префиксом SHORT.

ADD AX, BX

JMP Short M1

M2: ------/-------

M1: MOVAX, CX

----------/-----------

Замечание: команда, следующая за командой безусловной передачи управления, должна иметь метку.

К командам безусловной передачи данных относятся команды обращения к подпрограммам, процедурам, и возврат из них.Подпрограмма - это процедура, у которой есть тип дальности, определяющийся параметром по умолчанию тип NEAR, а FAR необходимо обязательно указывать.

PPProcFAR

------/-------

PPendp

Процедура типа NEAR может быть вызвана только из того кодового сегмента, в котором содержится ее полное определение (то есть описание). Процедура типа FAR может быть вызвана из любого сегмента. Поэтому тип вызова функции (дальность) определяется следующим образом: главная программа всегда имеет тип FAR, т.к. обращаются к ней из ОС или отладчика, если процедур несколько и они содержатся в одном кодовом сегменте, то все остальные, кроме главной, имеют тип NEAR. Если процедура описана в кодовом сегменте с другим именем, то у нее должен быть тип FAR.

1) Cseg segment….

assume …..

p1 proc far

-------------------------

call p2

m: mov AX, BX

--------------------------

ret

p1 endp

p2 proc near

m1: mov CX, DX

---------------------------

ret

p2 endp

Cseg ends

extrn p2: far cseg segment…… assume …… p1 proc far -------------------------- call p2 -------------------------- ret p1 endp cseg ends public p2 cseg1 segment….. assume …… p2 proc far ----------------------- ret p2 endp cseg1 ends  

2)

 

Команда вызова процедуры:

CALL<имя> ;

Адресация может быть использована как прямая, так и косвенная. При обращении к процедуре типа NEAR в стеке сохраняется адрес возврата, адрес команды, следующей за CALL содержится в IP или EIP. При обращении к процедуре типа FAR в стеке сохраняется полный адрес точки возврата CS:EIP. Возврат из процедуры реализуется с помощью команды RET.Она может иметь один из следующих видов:

- RET [n] ; возврат из процедуры типа NEAR, и из процедуры типа FAR

- RETN [n] ; возврат только из процедуры типа NEAR

- RETF [n] ; возврат только из процедуры типа FAR

Параметр n является необязательным, он определяет какое количество байтов удаляется из стека после возврата из процедуры.

Примеры прямого и косвенного перехода:

1) -------------

adwL ; значением а является смещение для переменной L

jmpL ; прямой переход по адресу L

jmpa ; косвенный переход - goto (a) = gotoL

--------------

2) ---------------------

movDX, a ; значение а пересылается в DX

jmpDX ; косвенный переход - goto (DX) = gotoL

---------------------

3) ---------------- 3) jmp wordptr z

jmp z ; ошибка -----------------------------

---------------- zDWL

Z DWL -----------------------------

Команды условной передачи управления можно разделить на три группы:

- команды, используемые после команд сравнения

- команды, используемые после команд, отличных от команд

- сравнения, но реагирующие на значения флагов

1) JZ/JNZ

2) JC/JNC

3) JO/JNO

4) JS/JNS

5) JP/JNP

- команды, реагирующие на значение регистра CX

В общем виде команду условной передачи управления можно записать так:

Jx<метка>

Здесь х – это одна, две, или три буквы, которые определяют условия передачи управления. Метка, указанная в поле операнда, должна отстоять от команды не далее чем -128 ÷ +127 байт.

Примеры:

JEM1 ; передача управления на команду с меткой М1, если ZF = 1

JNEM2 ; передача управления на команду с меткой М2, если ZF = 0

JCM3 ; передача управления на команду с меткой М3, если CF = 1

JNCM4 ; передача управления на команду с меткой М4, если CF = 0

ADDAX, BX

JCM

если в результате сложения CF = 1, то управление передается на команду с меткой М, иначе – на команду, следующую за JC

SUBAX, BX

JZMet

если результатом вычитания будет 0, то ZF = 1 и управление передается на команду с меткой Мet.

Часто команды передачи управления используются после команд сравнения

<метка>CMPOP1, OP2

По этой команде выполняется (OP1) – (OP2) и результат никуда не посылается, формируются только флаги.

Команды условной и безусловной передачи управления:

условие Для беззнаковыхчисел Для знаковых чисел
> JA JG
= JE JE
< JB JL
> = JAE JGE
< = JBE JLE
<> JNE JNE

Команды условной передачи управления могут осуществлять только короткий переход, а команды безусловной передачи управления могут реализовать как короткую передачу так и длинную.

Если необходимо осуществить условный дальний переход, то нужно использовать команду условного перехода вместе с командой безусловного перехода изменив условие перехода, то есть можно использовать jx вместе jmp следующим образом:

ifAX = BXgotom следует заменить на:

if AX<> BX goto L

Goto m ;m – дальняяметка

---------------------

L:----------------- ;L – близкая метка

На Ассемблере это будет так:

cmp AX, BX

jne L

Jmp m

мет: ----------------------

L: --------------------

С помощью команд условной и безусловной передачи jx и jmp можно реализовать цикл с предусловием:

1) while x > 0 do S;

beg: cmp x, byte ptr 0

jle fin

S

jmp beg

fin: ----------------------

и с постусловием:

2) do S while x > 0;

beg:

S

cmp x, byte ptr 0

jgbeg

fin: ______________

Команды организации циклов:

1) loop <метка>

2) loope< метка> loopz< метка>

3)Loopne< метка > loopnz< метка >

По команде в форме 1): (CX) = (CX) – 1 и если (CX) <> 0,®<метка>

По команде в форме 2): (CX) = (CX) – 1 и если (CX) <> 0 и одновр-но ZF =1,®<метка>

Цикл завершается, если или (CX) = 0 или ZF=0 или (CX)=(ZF)=0

По команде в форме 3): (CX) = (CX) – 1 и если (CX) <> 0 и одновр-но ZF=0, управление передается на указанную метку ®<метка>

Выход из цикла осуществляется, если или (CX) = 0 или ZF=1 или одновременно

(CX) = 0 и (ZF) = 1.

Примеры организации циклов:

После завершения цикла перейдем на метку m2 2)Регистр СХ может использоваться по умолчанию. Например, СХ используется при работе со строками (по умолчанию), может использоваться CLдля сдвига. Если в теле цикла используется регистр СХ, тогда организовать цикл можно следующим образом, с помощью регистра SI:  

1) -------------------------- 2) ----------------------

movCX, 100 movSI, 0

m1: mov AX, DX mov CX, 100

-------------------------- m1: pushCX

loopm1 ----------------------

m2: incSI

popCX

2) еслиCX нужно использовать loopm1

внутри цикла m2:

Вложенные циклы:

Сохранить в сете количество повторений цикла то есть содержимое СХ. СХ используем в теле цикла организации вложенных циклов.

Пример

Дана матрица целых байтовых величин, размером 4*5, необходимо подсчитать количество нулей и заменить их числом 0FFh. Под стек отведем 256 байтов, программу оформим как две последовательные процедуры: внешняя (FAR)– это связь с ОС, внутренняя (NEAR) – решение поставленной задачи.

Prim.asm

Title prim.asm

Page , 132

4. Sseg segment para stack ‘stack’

Db 256 dup (?)

Sseg ends

7. Dseg segment para public ‘data’

8. Dan db 0,2,5,0,91 ;адрес первого элемента массива

9. db 4,0,0,15,47; имя - Dan

Db 24,15,0,9,55

Db 1,7,12,0,4

Dseg ends

13. Cseg segment para public ‘code’



2018-07-06 400 Обсуждений (0)
ASSUME SS:CSeg, DS:CSeg, CS:CSeg 0.00 из 5.00 0 оценок









Обсуждение в статье: ASSUME SS:CSeg, DS:CSeg, CS:CSeg

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (400)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.01 сек.)