Я очень новичок в ассемблере и пытаюсь изучить его, разбираясь в дизассемблировании старой 16-битной игры для DOS (дизассемблирование, сгенерированное IDA Free).
В этом коде я прочитал две вещи и, думаю, догадался, что он делает. Тем не менее, я не совсем уверен, прав ли я, поэтому я хотел проверить (просто сократил код примера здесь, кстати):
1)
lds di, some_adress ; (eg: ds = 0012h, di=BAF6h afterwards)
xor cx, cx
mov [di], cx ; <- what segment is used here
Я предполагаю, что он использует ds
как какой-то волшебный сегмент по умолчанию, чтобы применить смещение и вычислить физический адрес.
2)
assume ds:dseg (e.g. 0012h)
mov ax, 0BAF6h ; <- why is the leading 0 here btw
push ds
push ax
поэтому мой стек выглядит так:
... ...
02 ds (0012)
00 ax (BAF6) <- sp
тогда:
mox bx, sp
les di, ss:[bx]
Я предполагаю, что регистры теперь es
=0012h
и di
=BAF6h
, что имело бы смысл при рассмотрении остального кода игры, но поскольку мой стек выглядит как BAF6 0012 ...
, это будет означать, что первое слово помещается в di
, а второе слово помещается в es
. Это меня немного смущает, так как это своего рода обратный порядок двух слов (с моей точки зрения).
di
, а второе — вes
(обратите внимание, что байты слов также хранятся в порядке с прямым порядком байтов). - person Jester   schedule 14.03.2013