Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
01.05.2014
Размер:
108.03 Кб
Скачать

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. Вывод: В результате проведенной лабораторной работы, мы освоили основные способы адресации.