Учебные материалы по математике | Ассемблер структура и образ памяти программы типа | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Ассемблер структура и образ памяти программы типа


Ассемблер

Структура и образ памяти программы типа. EXE

ES DS PSP
256 байт

СS Сегмент IP
команд

Сегмент
данных

SS Сегмент SP

стека

PSP – префикс программного сегмента

1.  title from lightbulb

2.  text segment ‘code’

3.  assume CS: text, DS:data

4.  myproc proc

5.  mov AX, data

6.  mov DS, AX

7.  ——————

8.  myproc endp

9.  text ends

10.  —————-

11.  data segment

12.  —————-

13.  data ends

14.  —————-

15.  stack segment stack ‘stack’

16.  dw 128 dup (0)

17.  stack ends

18.  end myproc

2. Идентификатор программного сегмента: слово в апострофах указывает класс «программный». Класс анализируется компоновщиком для компоновки загрузочного модуля, при этом сегменты, принадлежащие одному классу, загружаются в память друг за другом

3. Сопоставляет сегментные регистры и адресуемые ими сегменты

4. Имя процедуры

5. Инициализирует сегмент данных (настраиваем регистр данных на начало сегмента данных)

а) пересылает адрес в аккумулятор

б) из аккумулятора в сегмент данных

8. Конец процедуры

9. Конец сегмента

15. Описываем сегмент стека

Структура и образ памяти программы типа. COM

CS DS ES SS PSP

256 байт

IP = 100h Сегмент

команд и данных

SP = FFFEh

title from lightbulb

text segment ‘code’

assume CS:text, DS:text

org 100h ; резервирует 256 байт PSP

myproc proc

————————

myproc endp

———определения данных———————-

text ends

end myproc

Пример

TITLE COM-PROG

CODESG SEGMENT PARA ‘CODE’

ASSUME CS:CODESG, DS:CODESG, SS:CODESG, ES:CODESG

ORG 100h

BEGIN: JMP MAIN

;———

FLDA DW 250

FLDB DW 125

FLDC DW?

;———

MAIN PROC NEAR

MOV AX, FLDA ;переслать 0250 в AX

ADD AX, FLDB ; прибавить 0125 в AX

MOV FLDC, AX ; записать сумму в FLDC

RET ; вернуться в DOS

MAIN ENDP

CODESG ENDS

END BEGIN

Устройство Управления декодирует байты программы и управляет работой операционного устройства и шинного интерфейса.

Связь с внешними устройствами осуществляется через специальные тристабильные схемы, называемые буферами.

Регистр флагов

По результатам операций АЛУ аппаратно устанавливает либо сбрасывает отдельные биты в регистре флагов. Слово состояния процессора (PSW) приведено на рисунке

15 0

OF

DF

IF

TF

SF

ZF

x

AF

x

PF

x

CF

x означает, что содержимое бита не имеет значения

CF – флаг переноса (carry) устанавливается, если в результате выполнения операции из старшего бита переносится или занимается единица при сложении или вычитании, иначе CF = 0. На CF влияют также команды сдвига и умножения

PF – флаг четности (parity) равен 1, если результат операции содержит четное число двоичных единиц

AF – флаг дополнительного переноса (auxiliary) устанавливается, если есть перенос из старшего бита младшей тетрады (бит D3) в младший бит старшей тетрады (бит D4). Используется в операциях над упакованными BCD

ZF – флагпризнак нулевого результата, устанавливается в единицу, если получен нулевой результат, иначе ZF = 0

SF – флаг знака результата (sign) равен единице, если результат отрицательный, т. е. он дублирует старший знаковый бит результата

TF – флаг трассировки (отладки). Если этот флаг установлен в единичное состояние, то процессор переходит в режим пошагового выполнения команд, т. е. после выполнения каждой команды генерируется внутреннее прерывание (тип 1) через вектор, расположенный по адресу 04

IF – флаг разрешения прерывания – если флаг установили в единицу, то прерывания микропроцессора от внешних устройств разрешены (микропроцессор распознает маскируемые прерывания)

DF – флаг направления

OF – флаг переполнения установки

CF, DF, IF можно изменять программно

команды STC, STD, STI устанавливают соответствующие флаги в 1

команды CLC, CLD, CLI устанавливают соответствующие флаги в 0

Пример: сложение однобайтовых чисел

125+4=129 – выходит за пределы чисел со знаком (-128 — +127), но для беззнаковых чисел результат корректный

Перенос в бит D7 равен 1.
Флаги: OF = 1, CF = 0, ZF = 0, SF = 1, AF = 1

Резервирование памяти.

count dw 1000 // помещает значение 1000 по адресу count

coef dw 5, 10, 68 //указанными числами заполняются слова

mask db 0FFh // в байт с именем mask записывается FF

mes db ‘-смещение’

// байтовая строка с текстом «смещение» начиная с адреса mes

adr dw mes

// в слове adr смещение строки первого байта строки mes

addr dd myproc

//в двойном слове помещается двухместный адрес процедуры

В первом слове – относительный адрес

Во втором — сегментный

area dw 128 dup (?) // резервируем 128 слотов память

text db 100 dup (‘#’)

//100 байт массива заполняется кодом решетки

array dw 1024 dup (256)

//массив из 1024 слов, в каждом слове 256

константы

kilo equ 1024

//kilo – константа, которой присваивается значение 1024 навсегда

offs = 80-2*12+40*2

//начальное значение offs = … Но в тексте программы можно менять

leng = FFFh

//leng – название числа FFFF

mes db ‘ждите’

meslen = $ — mes

Использование байта в словных операциях (оператор PTR)

Bits dw F4E9h

mov ax, bits //помещает в аккумулятор F5E9

mov bh, byte ptr bits

//пересылает в старший байт регистра младший байт (E9) переменной

mov clm byte ptr bits + 1

//пересылка старшего байта (F5) в cl

addr dd myproc

// в двойное слово помещается двухсловный адрес процедуры

mov bx, word ptr addr //относительный адрес myproc

move es, word ptr addr + 2 //сегментный адрес

Все переменные адресуются младшим байтам

Система команд

Семь групп режимов адресации:

1.  Регистровая адресация

2.  Непосредственная адресация

3.  Прямая адресация

4.  Косвенная регистровая адресация

5.  Адресация по базе

6.  Прямая адресация с индексированием

7.  Адресация по базе с индексированием

Самые быстрые – регистровая и непосредственная, т. к. в этом случае операционный блок МП извлекает их либо из регистров, либо из конвейера команд

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

Регистровая адресация

Операнд извлекается из регистра

MOV AX, CX

INC CX

XCHG BX, BP

Непосредственная адресация

Константа является операндом-источником и содержится в команде

MOV CX, 500

MOV CL, -30

K EQU 1024

MOV CX, K

Прямая адресация

Исполнительный адрес является составной частью команды

MOV AX, TABLE

mem dw 0

……………….

inc mem

строгая запись

inc ds:mem

По умолчанию все смещения вычисляются относительно ds, поэтому его можно не указывать.

Обязательно указывать регистр

— для сегментных регистров ES, CS, SS

inc es:mem

— при обращении к памяти по известному АБСОЛЮТНОМУ адресу

mov al, ds:17h

mov bx, es:2ch

Косвенная регистровая адресация

Исполнительный адрес операнда содержится в базовом регистре BX, регистре указателя базы BP или в индексном регистре (SI или DI)

Операнды заключаются в квадратные скобки

При использовании BX, SI или DI подразумевается регистр DS

При использовании BP подразумевается регистр SS

MOV BX, OFFSET TABLE

MOV AX, [BX]

эти две команды выполняют те же действия, что и команда

MOV AX, TABLE

Адресация по базе

Исполнительный адрес вычисляется с помощью сложения значения сдвига с содержимым регистров BX или BP

MOV AX, [BX]+4 // если начальный адрес записи в BX, то в AX загрузится 5 и 6 байты от начала записи.

эта команда эквивалентна

MOV AX, 4[BX]

MOV AX, [BX+4]

Прямая адресация с индексированием

Исполнительный адрес вычисляется как сумма значений сдвига и индексного регистра (DI или SI). Тип адресации удобен при работе с таблицами, когда сдвиг указывает на начало таблицы, а индексный регистр – на её элемент

Например если TABLE – таблица байт, то последовательность команд

MOV DI, 2

MOV AL, TABLE [DI]

загрузит третий элемент таблицы TABLE в регистр AL

Адресация по базе с индексированием

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

MOV AX, TABLE [BX][DX]

возможна также следующая запись

MOV AX, TABLE[BX+2][DX]

MOV AX, TABLE [BX][DX+2]

Пример 1:

MOV CX, L ;инициализация счетчика

MOV SI, -1 ; инициализация индекса

MOV AL, 20h ; код пробела

NEX: INC SI ; увеличение индекса

CMP AL, STR [SI] ; сравнение с пробелом

LOOPNE NEX ; цикл пока CX не 0 и не пробел

JNZ ST ; если CX = 0, но не пробел

Пример 2:

array db 0, 10, 20, 30, 40, 50, 60, 70, 80, 90

mov bx, 5

mov al, array[bx]

или

mov bx, offset array

mov al, 5[bx]

Пример 3:

syms db ‘ЙЦУКЕНГШЩЗХЪ’

‘QWERTYUIOP[]’

…………………………

mov bx, 12

mov si, 6

mov dl, syms[bx][si]

Циклы

Команда LOOP служит для выполнения конечного числа циклов, использует начальное значение в регистре CX. В каждом цикле команда LOOP автоматически уменьшает содержимое СХ на 1. Пока значение СХ не будет равно 0, управление передается по адресу, указанному в операнде; если в СХ будет 0, управление переходит на следующую после LOOP команду

Разновидности:

1. LOOPE (LOOPZ) – передает управление, если СХ имеет ненулевое значение и флаг нуля установлен

2. LOOPNE (LOOPZE) – передает управление, если СХ имеет ненулевое значение и флаг нуля сброшен

Пример 1:

array dw 1024 dup (?)

mov cx, 1024

lea bx, array

mov si, 0

адрес массива помещен в ВХ

null: mov [bx][si], 0 //очищаем содержимое

inc si

inc si

loop null

loop уменьшает значение СХ на 1, если в СХ не 0, то переходит на метку

Пример 2: //фрагмент программы задержки выполнения

mov cx, 10

outer: push cx // сохраняем СХ в стеке

mov cx, 0 // пересылаем в СХ 0

tun: loop tun //цикл, вычитает 1, если не 0, то на метку

pop cx //восстанавливает значение из стека СХ

loop outer

Обработка строк байтов и слов

movs – пересылка строки

cmps – сравнение строк

scas – поиск в строке заданного символа

lods – загрузить AX из строки

stos – запись в строку из AX

Регистры, участвующие в цепочечных командах:

MOVS DI, SI

LODS AL, SI или AX SI

STOS DI, AL или DI, AX

CMPS SI, DI

SCAS DI, AL или DI, AX

Регистр SI обычно связан с регистром сегмента данных – DS:SL.

Регистр DI всегда связан с регистром дополнительного сегмента – ES:DI

MOVS, STOS, CMPS и SCAS требуют инициализации регистра ES (обычно адресом в регистре DS).

REP: префикс повторения цепочечной команды

При выполнении команды с префиксом REP происходит уменьшение на 1 значение в регистре CX до нуля

REP – повторять операцию, пока CX не равно 0

Пример: пересылка строки

STRL DB ‘режим’ ; исходная строка

STRLEN EQU $-STRL ; длина строки в байтах

TEXT DB 80 DUP (‘ ’) ; приемная строка

MOV CX, STRLEN ; пересылаем кол-во байт в CX

PUSH DS ; адрес сегмента данных в стек

POP ES ; настроили доп. сегмент

LEA SI, STRL ; адрес строки-источника загрузили в DI

LEA DI, TEXT ; строка-приемник — DI

CLD ; очистка флага, DF = 0

REP MOVSB ; пересылаем строку побайтно

REP заставляет МП выполнить MOVSB количество раз из CX

Возможная запись:

(REP MOVS TEXT, STRL)

Пример 2. Выполняется пересылка 20 байт из STRING1 в STRING2

Предположим, что оба регистра DS и ES инициализированы адресом сегмента данных

STRING1 DB 20 DUP (‘*’)

STRING2 DB 20 DUP (‘ ’)

CLD ; сброс флага DF

MOV CX,20 ; счетчик на 20 байт

LEA DI, STRING2 ; адрес области «куда»

LEA, SI, STRING1 ; адрес области «откуда»

REP MOVSB

При выполнении команд CMPS и SCAS возможна установка флагов состояния, так чтобы операция могла прекратиться сразу после обнаружения необходимого условия

REPZ или REPE – повторять операцию, пока флаг ZF показывает «равно или ноль».

Прекратить операцию при флаге ZF, указывающему на не равно или не ноль или при CX = 0

REPNE или REPNZ – повторять операцию, пока флаг ZF показывает «не равно или не ноль».

Прекратить операцию при флаге ZF, указывающему на «равно или нуль» или при CX = 0

Пример 3: сравнение 2-х строк

PATT DB ‘stringlen’ ; строка для сравнения

PATTLEN EQU $-PATT ; адрес и длина известны

TEXT DB 80 DUP (? ) ; приёмный буфер

PUSH DS

POP ES

LEA SI, PATT

LEA DI, TEXT

MOV CX, PATTLEN

CLD

REPE CMPSB

REPE – повторять, пока не будет CX = 0 или пока не встретятся разные элементы ZF = 0

Пример 4: поиск в строке заданного символа

STR DB 128 DUP (?)

MOV AL,’ ‘

PUSH DS

POP ES

LEA DI, STR

MOV CX,128

REPNE SCASB

; поиск пробела в строке, если символ найден – флаг ZF (нуля) установится в 1. Если символ не найден, то флаг = 0. При этом просматривается кол-во байт в CX

JNE NOT ; уход на метку, если не нашли (при ZF = 0)

DEC DI ; если символ найден, уменьшаем DI, чтобы он указывал на адрес найденного байта (символа ‘ ’)

Пример 5:

CLD

LEA SI, NAME1 ; загрузить первое слово

LODSW ; из NAME1 в AX

Пример 6:

LEA DI, NAME3

MOV CX,05

MOV AX,2020h ; переслать пробелы

REP STOSW ; в NAME3

Переходы. Прямой короткий, прямой ближний

Команды перехода JMP:

1) Прямой короткий

Пример:

seg segment ‘code’

…………………..

jmp short cont

…………………..

cont: ……………………

seg: ends

2) Прямой ближний

Пример

seg segment ‘code’

…………………..

jmp cont ; (или jmp near ptr cont)

…………………..

cont: ……………………

………………………..

seg: ends

3) Прямой дальний

seg1 segment ‘code’

…………………..

jmp far prt cont

…………………..

seg1 ends

seg2 segment ‘code’

cont: ……………………

seg2: ends

4) Косвенный ближний

Пример

seg1 segment ‘code’

…………………..

jmp DS: constadr ; переход не на метку constadr, а по адресу, содержащемуся в нем

…………………..

seg1 ends

dat segment

constadr dw cont

dat ends

5) Косвенный дальний

Пример

seg1 segment ‘code’

…………………..

jmp DS: constadr

seg1 ends

seg2 segment ‘code’

…………………..

cont …….

seg ends

dat segment

contadr dd cont

………………

dat ends

Вызовы процедур

CALL – команда вызова процедуры

1) Прямой ближний

Пример

seg segment ‘code’

mymain proc

call sub

……………………………..

mymain endp

sub proc near

…………….

ret

sub endp

seg ends

2) Прямой дальний

Пример

3) Косвенный ближний

Пример

seg segment ‘code’

mymain proc

……………………………..

call word ptr subadr

……………………………..

mymain endp

sub proc near

…………….

ret

sub endp

seg ends

dat segment

…………………………

subadr dw sub

………………………….

dat ends

4) Косвенный дальний

Пример

seg segment ‘code’

mymain proc

call dword

……………………………..

mymain endp

sub proc near

…………….

ret

sub endp

seg ends

dat segment

…………………………

subadr dw sub

………………………….

dat ends

Варианты вызовов процедур

call word ptr [bx] – если в bx адрес процедуры

call word ptr [bx],[si] – если в bx адрес таблицы адресов процедур, а в si – номер конкретной процедуры

call word ptr table [si] – если table – адрес таблицы адресов, а в si – номер конкретной процедуры

Основные команды

MOV – пересылка данных. Первый операнд замещается вторым

!для пересылки из памяти в память используют MOVS

!запрещено загружать сегментный регистр непосредственным значением (только через регистр) и пересылать из сегментного регистра в сегментный регистр (можно через стек)

XCHG – обмен данными между операндами

Пример:

mov ax, ff01h

mov si, 1000h

xchg ax, si

В результате выполнения команды xchg ax, si в AX будет 1000h, а в SI – ff01h

IN – ввод из порта

Вводит в AL или в AX из порта (внешнего устройства), адрес которого в DX. Если адрес порта меньше 255, тогда можно указывать непосредственное значение.

in al,60h ; ввод в AL из 60-го порта

mov dx,3d5h

in ax, dx

OUT – вывод в порт

Адрес порта должен находиться в DX, если адрес больше 255, иначе можно указывать непосредственное значение

out 61h, AL –

то, что находится в AL пишем по адресу 61, то есть по адресу

LES – загрузка указателя с использованием системного регистра ES

LEA – загрузка исполнительного адреса

lea si, mess аналогично mov, si, offset mess

LSS – загрузка указателя в сегментный регистр SS и указанный в команде регистр

Основные арифметические команды

ADD – целочисленное сложение

! запрещено в качестве обоих операндов использовать две ячейки памяти

ADC – сложение с переносом (как правило используется для 32-х разрядных чисел)

Складывает 1 и 2 операнд и прибавляет значение флага CF, при этом 1-й операнд теряется

Пример для 5FFFFh и 20005h

numl dw 0FFFFh ; младшая часть

numh dw 0005h ; старшая часть

………….

mov AX,0005h ; младшая часть

mov BX,0002h ; старшая часть

add ax, numl ; AX = 4, CF = 1

adc bx, numh ; BX:AX=0008:0004=80004h

SUB – вычитание целых чисел

SBB – целочисленное вычитание с заемом

Пример для 20000h-1000Ah:

num1 dw Ah

num2 dw 1h

mov ax,0

mov dx,2

sub ax, num1

sbb dx, num2

IMUL – умножение целых знаковых чисел

Умножение на AL или AX, при умножении на AX результат сохраняется в DX:AX, на AL – в AX

Недопустимо умножение на непосредственное число

Пример:

MOV AL,5

MOV BL,3

IMUL BL ; AX=000Fh

MOV AL,-5

MOV BL,3

IMUL BL ; AX = FFF1h

MUL – умножение знаковых чисел

Пример:

MOV AX, 256

MOV BX, 256

MUL BX ; DX = 0001h AX = 0000h (65536)

IDIV – деление знаковых

В команде указывается делитель

1) В аккумуляторе AX – результат в AL (частное), AH – остаток

2) В DX – старшая часть числа, в AX – младшая, результат в AX, остаток – в DX

Пример:

MOV AX, -506

MOV BL, 50

IDIV BL ; AL = F6h(-10) AH = FAh (-6)

DIV – деление беззнаковых

MOV DX,1

MOV AX,1

MOV CX,256

DIV CX ; AX = 0100h

CBW – преобразует байт в слово (60h из AL в 0060h в AX, передавая знаковый бит через AH)

CBW ; расширение AL до AX

ADD AX, 20h ; прибавить к AX

Многословное сложение

WORD1A DW 0123h ; первое число старшая часть

WORD1B DW BC62h ; второе число старшая часть

WORD2A DW 0012h ; первое число младшая часть

WORD2B DW 553Ah ; второе число младшая часть

WORD3A DW?

WORD 3B DW?

;—————————————

MAIN PROC NEAR ; основная процедура

CALL DWD1 ; вызвать сложение 1

CALL DWD2 ; вызвать сложение 2

RET

MAIN ENDP

;—————————————

DWD1 PROC ; работает не в общем случае

MOV AX, WORD1B ; сложить правые слова

ADD AX, WORD2B

MOV WORD3B, AX

MOV AX, WORD1A ; сложить левые слова

ADC AX, WORD2A ; с переносом

MOV WORD3A, AX

RET

DWD1 ENDP

;————————————

DWD2 PROC ; сложение любой длины

CLC ; очистить флаг переноса

MOV CX,2 ; счетчик

LEA SI, WORD1B ; левое слово первого

LEA DI, WORD2B ; левое слово второго

LEA BX, WORD3B ; левое слово суммы

E20:

MOV AX,[SI] ; поместить слово в AX

ADC AX, [DI] ; сложить с переносом

MOV [BX], AX ; сохранить слово

DEC SI

DEC SI

DEC DI

DEC DI

DEC BX

DEC BX

LOOP E20

RET

DWD2 ENDP

ASCII-формат

Команды для арифметических операций:

AAA – коррекция для сложения

Пример:

MOV AX, 0605h ; двоично-десятичное 605

ADD AL, 09h ; двоично-десятичное 09 в AX = 060Eh

AAA ; AX = 0704 т. е. двоично-десятичное 74

AAD – коррекция для деления

Пример:

MOV AX, 0207h ; 27 десятичное

MOV DL, 06h

AAD ; AX = 001B=27 десятичное

DIV DL ; AX = 0304

AAM – коррекция для умножения

Пример:

MOV AL, 08h ; 8 десятичное

MOV CL, 07h ; 7 десятичное

MUL CL ; AX = 0038h = 56 десятичное

AAM ; AX = 0506h

AAS – коррекция для вычитания

Пример:

MOV AX, 0708h ; 78 десятичное

MOV CL, 09h ; 9 десятичное

SUB AL, CL ; AX = 07FF (CF = 1)

AAS ; AX = 0609h

TITLE EXCONV (COM)

CODESG SEGMENT PARA ‘CODE’

ASSUME CS:CODESG, DS:CODESG, SS:CODESG

ORG 100h

BEGIN: JMP SHORT MAIN

ASCVAL DB ‘1234’

BINVAL DB 0

ASCLEN DB 4

MULT10 DB 1

; —————————————-

MAIN PROC NEAR ; основная процедура

CALL B10ASBI

CALL C10BIAS

RET

MAIN ENDP

; —————————————- преобразование в двоичное

B10ASBI PROC

MOV CX, 10 ; фактор умножения

LEA SL, ASCVAL-1 ; адрес ASCVAL

MOV BX, ASCLEN ; длина ASCVAL

B20:

MOV AL, [SI+BX] ; выбрать ASCII-символ

AND AX, 000Fh ; очистить зону тройки (31 -> 1; 34 -> 4 etc.)

MUL MULT10 ; умножить на фактор 10

ADD BINVAL ; прибавить к двоичному

MOV AX, MULT10 ; вычислить следующий

MUL CX ; фактор умножения

MOV MULT10, AX

DEC BX ; последний ASCII-символ?

JNZ B20 ; нет – продолжить

RET

B10ASBI ENDP

; —————————————-

Логические операции

AND: Если оба из сравниваемых битов равны 1, то результат равен 1; во всех остальных случаях результат – 0

Пример:

AND AL, BH ; устанавливает в AL 0100 0100

AND AL, 00 ; устанавливает в AL 0000 0000

AND AL, 0Fh ; устанавливает в AL 0000 0101

OR: Если хотя бы один из сравниваемых битов равен 1, то результат равен 1; если сравниваемые биты равны 0, то результат – 0

Пример:

OR BH, AL ; устанавливает в BH 1101 1101

 

XOR: Если один из сравниваемых битов равен 0, а другой равен 1, то результат – 1; если сравниваемые биты одинаковы, то результат – 0

Пример:

XOR AL, AL ; устанавливает в AL 0000 0000

TEST: Действует как AND – устанавливает флаги, но не изменяет биты

TEST BL, 11110000B

JNZ …

TEST AL, 00000001B

JNZ …

NOT – инвертирует значения бит в байтесловерегистрепамяти. Флаги не меняются

AL = 1100 0101

NOT AL = 0011 1010

Работа с файлом

int 13h – прерывание BIOS, на нижнем уровне

int 21h – прерывание DOS, на верхнем уровне

Каждому подкаталогу отводится 32 байта

Дескрипторы

0 – стандартный ввод (с клавиатуры)

1 – стандартный вывод (на экран)

2 – стандартная ошибка (на экран)

3 – стандартный вспомогательный порт

4 – стандартный принтер (вывод на принтер)

Функции DOS для работы с файлом

3C – создать (уничтожается имеющийся)

5A – создать временный файл (в DS:DX адрес пути к файлу НЕ ИМЕНИ в строке должно быть 13 пустых байт)

5B – создает новый файл (если существует, то завершение с CF = 1)

3D – открыть

3E – закрыть

68h – сбросить на диск

41h – удалить

42h – установить указатель (AL = 0 – в начало; AL = 1 – текущее положение значения смещения в CX:DX; AL = 2 – в конец)

3F – читать из файла

40h – записать в файл

43h – получить и установить атрибуты файла

56h – переименовать (старое имя – в DS:DX, новое – в ES:DX[?])

Атрибуты файла в CX (для создания с 3C):

0 – нет атрибутов

1 – только чтение

2 – скрытый

4 – системный

8 – метка тома

20 – атрибут архива

Режимы доступа в AL

0 – чтение

1 – запись

2 – чтение-запись

Примеры:

1) Создание

MOV AH, 3Ch

MOV CX, 0

MOV DX, OFFSET FILENAME ; адрес имени

INT 21h

MOV HANDLE, AX

DATA SEGMENT

FILENAME DB ‘myfile’, 0

HANDLE DW?

Остальное – в лабах и методичке

Команды сдвига и циклического сдвига

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

— обрабатывают байт или слово

— имеют доступ к регистру или к памяти

— сдвигают влево или вправо

— сдвигают на величину до 8 бит (для байта) и 16 бит (для слова)

— сдвигают логически (без знака) или арифметически (со знаком)

При выполнении команд сдвига флаг CF всегда содержит значение последнего выдвинутого бита. Команды сдвига:

SHR ; логический сдвиг вправо

SHL ; логический сдвиг влево

SAR ; арифметический сдвиг вправо

SAL ; арифметический сдвиг влево

Пример:

MOV CL, 03 ; AX:

MOV AX, 10110111B ; 10110111

SHR AX,1 ; 01011011 сдвиг вправо на 1

SHR AX, CL ; 00001011 сдвиг вправо на 3

MOV CL,03

MOV AX,10110111B ; 10110111

SAR AX, 1 ; 11011011

SAR AX, CL ;

Для заполнения левого бита SAR использует знаковый бит, SHR заполняет нулями

Сдвиг влево используется для удваивания чисел, а сдвиг вправо – для деления на 2.

Для проверки бита, занесенного в флаг CF, используется команда JC

Команды циклического сдвига – выдвинутый бит занимает освободившийся разряд

ROR ; циклический сдвиг вправо

ROL ; циклический сдвиг влево

RCR ; циклический сдвиг вправо с переносом

RCL ; ; циклический сдвиг влево с переносом

Макросредства

INIT1 MACRO

ASSUME CS:CSDEG, DS:DSEG, SS:STACK, ES:DSEG

PUSH DS

SUB AX, AX

PUSH AX

MOV AX, DSEG

MOV DS, AX

MOV ES, AX

ENDM

INIT2 MACRO CSNAME, DSNAME, SSNAME ; параметры макроса

PUSH DS

SUB AX, AX

PUSH AX

MOV AX, DSEG

MOV DS, AX

MOV ES, AX

ENDM

Дополнительные команды:

LAHF – загрузка AH из регистра флагов

Команда копирует пять признаков МП (знака, нулевого результата, вспомогательного переноса, четности и переноса) в биты регистра AH с номерами 7, 6, 4, 2, 0 соответственно. Сами признаки при выполнении этой команды не меняются

SAHF – загрузка AH в регистр флагов

PUSH – загрузка слова в стек

Уменьшает SP на 2, пересылает операнд в новую верхушку стека. Операнды: регистр (PUSH BX), сегм. регистр, кроме CS(PUSH ES), память (PUSH PARAMETERS)

POP – выборка слова из текста

PUSHF – загрузка содержимого регистра FLAGS в стек

POPF – пересылка слова из стека в регист FLAGS

CBW – преобразование байта в слово

Расширяет бит знака регистра AL в регистр AH, переводит байтовую величину со знаком в эквивалентное слово со знаком

CWD – преобразование слова в двойное слово

Расширяет бит знака регистра AX на весь регистр DX, генерирует двойное слово, эквивалентное числу со знаком из региcтра AX.

CLC – сброс признака переноса (устанавливает CF = 0)

STC – установка признака переноса (устанавливает CF = 1)

CLD – сброс признака направления (устанавливает DF = 0)

STD – установка признака направления (устанавливает DF = 1)

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020