7. Адресация по базе с индексированием и масштабированием
Это самая полная возможная схема адресации, в которую входят все случаи, рассмотренные ранее, как частные. Смещение может быть байтом или двойным словом. Если ESP или ЕВР используются в роли базового регистра, селектор сегмента операнда берется по умолчанию из регистра SS, во всех остальных случаях -из DS.
Компиляция и линковка программы прошла c ошибкaми:
Список ошибок из файла lab2_ofc.lst
mov mem3,[bx]
**Error** lr2bak.ASM(76) Illegal memory reference
mov cx,vec2[di]
**Error** lr2bak.ASM(83) Operand types do not match
mov cx,matr[bx][di]
**Error** lr2bak.ASM(87) Operand types do not match
mov ax,matr[bx*4][di]
**Error** lr2bak.ASM(88) Operand types do not match
mov ax,matr[bp+bx]
**Error** lr2bak.ASM(108) Operand types do not match
mov ax,matr[bp+di+si]
**Error** lr2bak.ASM(109) Too many registers in expression
Таблица 1
Содержимое регистров при отладке программы в Turbo Debugger v3.1
CPU code : 58f3:0000 1E
push DS
ax 0000
bx 0000
cx 0000
dx 0000
si 0000
di 0000
bp 0000
sp 0000
ds 58D9
es 58D9
ss 58E9
cs 58F3
ip 0000
CPU code : 58f3:0001 2B C0
sub AX,AX
ax 0000
bx 0000
cx 0000
dx 0000
si 0000
di 0000
bp 0000
sp FFFE
ds 58D9
es 58D9
ss 58E9
cs 58F3
ip 0001
CPU code : 58f3:0003 50
push AX
ax 0000
bx 0000
cx 0000
dx 0000
si 0000
di 0000
bp 0000
sp FFFE
ds 58D9
es 58D9
ss 58E9
cs 58F3
ip 0003
CPU code : 58f3:0004 B8 ED 58
mov AX,DATA
ax 0000
bx 0000
cx 0000
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58D9
es 58D9
ss 58E9
cs 58F3
ip 0004
CPU code : 58f3:0007 8E D8
mov DS,AX
ax 58ED
bx 0000
cx 0000
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58D9
es 58D9
ss 58E9
cs 58F3
ip 0007
CPU code : 58f3:0009 B8 F4 01
mov ax,n1
ax 58ED
bx 0000
cx 0000
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0009
CPU code : 58f3:000c 8B C8
mov cx,ax
ax 01F4
bx 0000
cx 0000
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 000C
CPU code : 58f3:000e B3 24
mov bl,EOL
ax 01F4
bx 0000
cx 01F4
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 000E
CPU code : 58f3:0010 B7 CE
mov bh,n2
ax 01F4
bx 0024
cx 01F4
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0010
CPU code : 58f3:0012 C7 06 02 00 CE FF
mov mem2,n2
ax 01F4
bx CE24
cx 01F4
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0012
CPU code : 58f3:0018 BB 06 00
mov bx,OFFSET vec1
ax 01F4
bx CE24
cx 01F4
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0018
CPU code : 58f3:001b A3 00 00
mov mem1,ax
ax 01F4
bx 0006
cx 01F4
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 001B
CPU code : 58f3:001e 8A 07
mov al,[bx]
ax 01F4
bx 0006
cx 01F4
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 001E
CPU code : 58f3:0020 A2 04 00
mov byte ptr mem3,al
ax 0112
bx 0006
cx 01F4
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0020
CPU code : 58f3:0023 8A 47 03
mov al,[bx]+3
ax 0112
bx 0006
cx 01F4
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0023
CPU code : 58f3:0026 8B 4F 03
mov cx,3[bx]
ax 010F
bx 0006
cx 01F4
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0026
CPU code : 58f3:0029 BF 02 00
mov di,ind
ax 010F
bx 0006
cx 0B0F
dx 0000
si 0000
di 0000
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0029
CPU code : 58f3:002c 8A 85 0E 00
mov al,vec2[di]
ax 010F
bx 0006
cx 0B0F
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 002C
CPU code : 58f3:0030 B5 00
mov ch,0
ax 01E2
bx 0006
cx 0B0F
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0030
CPU code : 58f3:0032 8A 8D 0E 00
mov cl,vec2[di]
ax 01E2
bx 0006
cx 000F
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0032
CPU code : 58f3:0036 BB 03 00
mov bx,3
ax 01E2
bx 0006
cx 00E2
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0036
CPU code : 58f3:0039 8A 81 16 00
mov al,matr[bx][di]
ax 01E2
bx 0003
cx 00E2
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0039
CPU code : 58f3:003d B5 00
mov ch,0
ax 01FF
bx 0003
cx 00E2
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 003D
CPU code : 58f3:003f 8A 89 16 00
mov cl,matr[bx][di]
ax 01FF
bx 0003
cx 00E2
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 003F
CPU code : 58f3:0043 53
push bx
ax 01FF
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0043
CPU code : 58f3:0044 51
push cx
ax 01FF
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFA
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0044
CPU code : 58f3:0045 B1 02
mov cl,2
ax 01FF
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFF8
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0045
CPU code : 58f3:0047 D3 E3
shl bx,cl
ax 01FF
bx 0003
cx 0002
dx 0000
si 0000
di 0002
bp 0000
sp FFF8
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0047
CPU code : 58f3:0049 B4 00
mov ah,0
ax 01FF
bx 000C
cx 0002
dx 0000
si 0000
di 0002
bp 0000
sp FFF8
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0049
CPU code : 58f3:004b 8A 81 16 00
mov al,matr[bx][di]
ax 00FF
bx 000C
cx 0002
dx 0000
si 0000
di 0002
bp 0000
sp FFF8
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 004B
CPU code : 58f3:004f 59
pop cx
ax 00FA
bx 000C
cx 0002
dx 0000
si 0000
di 0002
bp 0000
sp FFF8
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 004F
CPU code : 58f3:0050 5B
pop bx
ax 00FA
bx 000C
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFA
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0050
CPU code : 58f3:0051 B8 ED 58
mov ax, SEG vec2
ax 00FA
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0051
CPU code : 58f3:0054 8E C0
mov es, ax
ax 58ED
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58D9
ss 58E9
cs 58F3
ip 0054
CPU code : 58f3:0056 26 8B 07
mov ax, es:[bx]
ax 58ED
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0056
CPU code : 58f3:0059 B8 00 00
mov ax, 0
ax 12FF
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0059
CPU code : 58f3:005c 8E C0
mov es, ax
ax 0000
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 005C
CPU code : 58f3:005e 1E
push ds
ax 0000
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 0000
ss 58E9
cs 58F3
ip 005E
CPU code : 58f3:005f 07
pop es
ax 0000
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFA
ds 58ED
es 0000
ss 58E9
cs 58F3
ip 005F
CPU code : 58f3:0060 26 8B 4F FF
mov cx, es:[bx-1]
ax 0000
bx 0003
cx 00FF
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0060
CPU code : 58f3:0064 91
xchg cx,ax
ax 0000
bx 0003
cx FFCE
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0064
CPU code : 58f3:0065 BF 02 00
mov di,ind
ax FFCE
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0065
CPU code : 58f3:0068 26 89 01
mov es:[bx+di],ax
ax FFCE
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0068
CPU code : 58f3:006b 8B EC
mov bp,sp
ax FFCE
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp 0000
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 006B
CPU code : 58f3:006d 56
push si
ax FFCE
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 006D
CPU code : 58f3:006e 8B F3
mov si,bx
ax FFCE
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 006E
CPU code : 58f3:0070 B4 00
mov ah,0
ax FFCE
bx 0003
cx 0000
dx 0000
si 0003
di 0002
bp FFFC
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0070
CPU code : 58f3:0072 3E 8A 82 16 00
mov al,matr[bp+si]
ax 00CE
bx 0003
cx 0000
dx 0000
si 0003
di 0002
bp FFFC
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0072
CPU code : 58f3:0077 5E
pop si
ax 00EC
bx 0003
cx 0000
dx 0000
si 0003
di 0002
bp FFFC
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0077
CPU code : 58f3:0078 57
push di
ax 00EC
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0078
CPU code : 58f3:0079 03 FE
add di,si
ax 00EC
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0079
CPU code : 58f3:007b B4 00
mov ah,0
ax 00EC
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 007B
CPU code : 58f3:007d 3E 8A 83 16 00
mov al,matr[bp+di]
ax 00EC
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 007D
CPU code : 58f3:0082 5F
pop di
ax 00F6
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0082
CPU code : 58f3:0083 FF 36 00 00
push mem1
ax 00F6
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0083
CPU code : 58f3:0087 FF 36 02 00
push mem2
ax 00F6
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0087
CPU code : 58f3:008b 8B EC
mov bp,sp
ax 00F6
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFFC
sp FFF8
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 008B
CPU code : 58f3:008d 8B 56 02
mov dx,[bp]+2
ax 00F6
bx 0003
cx 0000
dx 0000
si 0000
di 0002
bp FFF8
sp FFF8
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 008D
CPU code : 58f3:0090 58
pop ax
ax 00F6
bx 0003
cx 0000
dx 01F4
si 0000
di 0002
bp FFF8
sp FFF8
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0090
CPU code : 58f3:0091 58
pop ax
ax FFCE
bx 0003
cx 0000
dx 01F4
si 0000
di 0002
bp FFF8
sp FFFA
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0091
CPU code : 58f3:0092 CB
retf
ax 01F4
bx 0003
cx 0000
dx 01F4
si 0000
di 0002
bp FFF8
sp FFFC
ds 58ED
es 58ED
ss 58E9
cs 58F3
ip 0092
CPU code : 58d9:0000 CD 20
int 20
ax 01F4
bx 0003
cx 0000
dx 01F4
si 0000
di 0002
bp FFF8
sp 0000
ds 58ED
es 58ED
ss 58E9
cs 58D9
ip 0000
Terminated, exit code 0
Таблица 2
EOL EQU '$'
ind EQU 2
n1 EQU 500
n2 EQU -50
; Стек программы
AStack SEGMENT STACK
DW 12 DUP(?)
AStack ENDS
; Данные программы
DATA SEGMENT
; Директивы описания данных
mem1 DW 0
mem2 DW 0
mem3 DW 0
vec1 DB 18,17,16,15,11,12,13,14
vec2 DB 30,40,-30,-40,10,20,-10,-20
matr DB -4,-3,1,2,-2,-1,3,4,5,6,7,8,-8,-7,-6,-5
;vec1 DB 1,2,3,4,8,7,6,5
;vec2 DB -10,-20,10,20,-30,-40,30,40
;matr DB 1,2,3,4,-4,-3,-2,-1,5,6,7,8,-8,-7,-6,-5
DATA ENDS
; Код программы
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:AStack
; Головная процедура
Main PROC FAR
push DS
sub AX,AX
push AX
mov AX,DATA
mov DS,AX
; ПРОВЕРКА РЕЖИМОВ АДРЕСАЦИИ НА УРОВНЕ СМЕЩЕНИЙ
; Регистровая адресация
mov ax,n1
mov cx,ax
mov bl,EOL
mov bh,n2
; Прямая адресация
mov mem2,n2
mov bx,OFFSET vec1
mov mem1,ax
; Косвенная адресация
mov al,[bx]
; Ошибка mov mem3,[bx]
mov byte ptr mem3,al
; Нельзя пересылать напрямую данные из одного участка памяти в другой
; пересылка происходит из ячейки размером в байт, в ячейку размером в слово
; поэтому надо указать размер операнда mem3
; Базированная адресация
mov al,[bx]+3
mov cx,3[bx]
; Индексированная адресация
mov di,ind
mov al,vec2[di]
; Ошибка mov cx,vec2[di]
mov ch,0
mov cl,vec2[di]
; Ошибка заключается в несоответствии размеров операндов
; исправляется разнесением пересылок в младшую и старшую части регистра
; Адресация с базированием и индексированием
mov bx,3
mov al,matr[bx][di]
;Ошибка mov cx,matr[bx][di]
mov ch,0
mov cl,matr[bx][di]
; Ошибка заключается в несоответствии размеров операндов
; исправляется разнесением пересылок в младшую и старшую части регистра
;Ошибка mov ax,matr[bx*4][di]
push bx
push cx
mov cl,2
shl bx,cl
mov ah,0
mov al,matr[bx][di]
pop cx
pop bx
; Ошибка заключается в несоответствии размеров операндов
; исправляется разнесением пересылок в младшую и старшую части регистра
; Неверно используется умножение при адресации
; ПРОВЕРКА АДРЕСАЦИИ С УЧЕТОМ СЕГМЕНТОВ
; Переопределение сегмента
; ------ вариант 1
mov ax, SEG vec2
mov es, ax
mov ax, es:[bx]
mov ax, 0
; ------ вариант 2
mov es, ax
push ds
pop es
mov cx, es:[bx-1]
xchg cx,ax
; ------ вариант 3
mov di,ind
mov es:[bx+di],ax
; ------ вариант 4
mov bp,sp
; Ошибка mov ax,matr[bp+bx]
; Неверное использование адресации
push si
mov si,bx
mov ah,0
mov al,matr[bp+si]
pop si
; Ошибка mov ax,matr[bp+di+si]
Слишком много параметров адресации
push di
add di,si
mov ah,0
mov al,matr[bp+di]
pop di
; Использование сегмента стека
push mem1
push mem2
mov bp,sp
mov dx,[bp]+2
; Ошибка ret 2
; В стеке занесено 4 байта значений, а так как при выполнеии этой команды происходит сначала возврат, а потом удаление из стека двух байт, то в результате не правильно вычисляется адрес выхода из процедуры.
pop ax
pop ax
ret
main ENDP
CODE ENDS
END Main
5. Вывод: В результате проведенной лабораторной работы, мы освоили основные способы адресации.