В этом методе адресации смещение операнда в памяти вычисляется как сумма чисел, содержащихся в двух регистрах, и смещения, если оно указано. Все перечисленные ниже команды представляют собой разные формы записи одного и того же действия:
mov ax,[bx+si+2]
mov ax,[bx][si]+2
mov ax,[bx+2][si]
mov ax,[bx][si+2]
mov ax,2[bx][si]
В регистр АХ помещается слово из ячейки памяти со смещением, равным сумме чисел, содержащихся в ВХ, SI, и числа 2. Из 16-битных регистров так можно складывать только ВХ + SI, ВХ + DI, ВР + SI и ВР + DI, а из 32-битных - все восемь регистров общего назначения. Как и для прямой адресации, вместо непосредственного указания числа разрешено использовать имя переменной, заданной одной из директив определения данных. Таким образом можно считать, например, число из двумерного массива: если задана таблица 10х10 байт, 2 - смещение ее начала от начала сегмента данных (на практике будет использоваться имя этой таблицы), ВХ = 20, а SI = 7, приведенные команды прочитают слово, состоящее из седьмого и восьмого байтов третьей строки. Если таблица состоит не из одиночных байтов, а из слов или двойных слов, удобнее использовать наиболее полную форму - адресацию по базе с индексированием и масштабированием.
Пример программы записи в EMS –память результата сложения двух чисел.
.model tiny
.code
org 100h
.286
start:
mov dx,offset mess
mov ah,9
int 21h
;проверка наличия устройства emmxxxx0
mov dx,offset ems_driver
mov ax,3d00h
int 21h
jc no_emmx ;нет устройства
mov bx,ax
mov ax,4400h
int 21h
jc no_ems ;не открывается
test dx,80h
jz no_ems ;оно файл
;выделить память под буфер в ems
mov ax,4100h ;получить адрес окна
int 67h
mov bp,bx
mov ax,4300h
mov bx,1
int 67h ;выделить 1*16 кб
cmp ah,0
jnz ems_failed ;не хватает памяти
mov word ptr ems_handle,dx ;сохраним информацию
mov ax,4400h
mov bx,0
int 67h ;отобразить в страницу 0
mov ah,9
mov dx, offset ems_msg1
int 21h ;оно есть
mov ax,bp ;адрес окна в ax
jmp short ems_used
ems_failed:
no_ems:
mov ah,3eh
int 21h ;закроем файл устройство
no_emmx:
mov ah,9 ;не получилось
mov dx,offset conv_msg
int 21h
jmp exit
;используем
ems_used:
mov word ptr buffer_seg,ax ;Сохраняем сегментный адрес буфера ЕММ
mov es,ax ;Запись в ES-сегментный регистр ;сегментный адрес буфера ЕММ
mov al,50h
mov ah,12h
add al,ah ;складываем источник с приемником
mov es:0,ax
mov ax,4700h ;сохраним
int 67h
mov ax,es:0
mov dh,al
and dh,0fh ;логическое И,в DH-младшие 4 бита
shr al, 4 ;в AL-старшие
call m2 ;вывести старшую цифру
mov al,dh ; в AL-младшие 4 бита
m2: cmp al,10 ;Три команды, переводящие в AL
sbb al,69h ;в соответствующий ASCII-код
das
mov dl,al ;в DL помещаем код символа
mov ah,2 ;номер в AH
int 21h
exit: ret
ems_driver db "EMSXXXX0",0 ;название устройства
conv_msg db"не хватает EMS памяти"
ems_msg db 'EMS в памяти не обнаружен',0dh,0ah,'$'
ems_msg1 db 'EMS в памяти ЕСТЬ',0dh,0ah,'$'
ems_handle dw 0 ;индификатор ЕМS
buffer_seg dw 0 ;сегментный адрес ЕМS
mess db "Emm",0dh,0ah
db " Работа с emm",0dh,0ah,'$'
chislo db "0000"
end start
Задание:
Записать результат лабораторной работы №2 в EMS – память.