ASSUME SS:CSeg, DS:CSeg, CS:CSeg
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
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) и результат никуда не посылается, формируются только флаги. Команды условной и безусловной передачи управления:
Команды условной передачи управления могут осуществлять только короткий переход, а команды безусловной передачи управления могут реализовать как короткую передачу так и длинную. Если необходимо осуществить условный дальний переход, то нужно использовать команду условного перехода вместе с командой безусловного перехода изменив условие перехода, то есть можно использовать 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. Примеры организации циклов:
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’
Популярное: Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (400)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |