Почему CX работает в '[]' в 16-битной сборке, когда это не базовый или индексный регистр? - PullRequest
0 голосов
/ 22 октября 2018

При использовании MASM 6.15 в DOSBox, когда я пытаюсь сделать:

mov al, [cx]

или

mov al, [cx + bx]

или

mov al, [cx + 4]

Я получаю сообщение об ошибке:«Разрешены только базовые или индексные регистры»

Но опять же, скажем, у меня есть массив var1.Если я сделаю:

.model small
.stack 4096

.data
 var1 BYTE 1, 2, 3, 4, 5, 6, 7, 8, 9

.code
main proc
mov ax, @data
mov ds, ax

mov cx, 5
mov al, [var1 + cx]

mov ah, 4Ch
int 21h
main endp
end main

Это прекрасно работает.Почему это не дает ту же ошибку, что и выше?CX не является базовым или индексным регистром.

Какова вся рабочая сущность оператора []?

1 Ответ

0 голосов
/ 22 октября 2018

Это ошибка в некоторых версиях MASM .В таких случаях MASM будет пытаться неправильно закодировать инструкцию, которая не должна быть возможной.Он должен был выдать ошибку, пытаясь закодировать это, поскольку CX не может использоваться в качестве основы или индекса в 16-битной адресации.

mov al, [var1 + cx]

Вместо генерирования ошибки этонеправильно генерирует его как:

mov bh, var1[bx+si]

Недопустимая инструкция кодируется как:

8A B8 xx xx

Где xx xx - это смещение var1.

...