Ассемблер структура и образ памяти программы типа
Ассемблер
Структура и образ памяти программы типа. EXE
ES DS PSP |
С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)