Да, это разрешено / поддерживается.
У @ elder_george есть хотя бы правильные вещи: вы чаще хотите поместить адрес в регистр, а не кодировать его в инструкции. В довольно типичном случае, когда вы проходите массив, вы можете захотеть что-то вроде:
mov bx, offset a
xor si, si
next_char:
mov al, bx[si]
; process al
inc si
cmp si, 5
jle next_char
Однако, если это возможно, часто более удобно обрабатывать данные с конца до начала:
mov bx, offset a
mov si, 5
next_char:
mov al, bx[si]
; process al
dec si
jnz next_char
Или вы можете поменять ролями базы и индекса для другой (в настоящее время в основном устаревшей) оптимизации:
mov esi, offset a
mov ecx, 5
next_char:
mov al, esi[ecx]
; process al
loop next_char
Вы можете сделать этот конкретный трюк только с 32-битными регистрами - ecx может действовать как «базовый» регистр, но cx не может (и цикл только работает с [e] cx. И наоборот, bx и bp могут действовать как базовые регистры, но loop
не будет работать с ними.