我对汇编很陌生,并尝试通过了解一个旧的 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
。这让我有点困惑,因为它有点颠倒了这两个词的顺序(从我的角度来看)。