edit: Извините, я имел в виду 100 элементов в массиве. Отредактировано с 4.
Мне трудно понять, как работает ассемблер, когда дело доходит до индексов массива. Я приложил код ниже. Как видите, я закомментировал ту часть, которая мне не ясна. di равно 64h, что равно 100 в десятичном виде, после 1 shl оно становится c8h, что равно 200 в десятичном, после вычитания 2 оно становится c6h, которое равно 198 в десятичном виде.
Теперь после строки L1 я вижу: mov dx, xx [di]. он прекрасно компилируется и также показывает последний элемент массива (который является 19h, 25 в десятичном виде, потому что это dup. Простите за создание такого глупого сложного массива). Как это работает? Разве это не выходит за рамки?
Буду признателен за любую помощь ... Спасибо! Код ниже:
.model small
.stack 100
.data
xx dw 4 dup (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)
n1 db 100
.code
main:
mov ax,@data
mov ds, ax
mov cx,0
mov cl,n1
mov di, cx ;di=64h=100d
shl di,1 ;di=c8h = 200d
sub di, 2 ;di= c6h = 198d
mov si,0 ; si= 0
L1:
mov ax,xx[si]
mov dx,xx[di]
mov xx[si], dx
mov xx[di],ax
add si,2
sub di, 2
cmp si,cx
jl L1
mov ax,4c00h
int 21h
end main