Как ассемблер сбрасывает индекс массива, когда он достигает последнего - PullRequest
0 голосов
/ 12 марта 2020

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
...