1

我对汇编很陌生,并尝试通过了解一个旧的 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=0012hdi= BAF6h,这在查看其余游戏代码时是有意义的,但由于我的堆栈看起来像BAF6 0012 ...,这意味着第一个单词被放入di,而第二个单词被放入es。这让我有点困惑,因为它有点颠倒了这两个词的顺序(从我的角度来看)。

4

1 回答 1

1
  1. ds[bp+immediate]是除,[bp+si+immediate]和之外的所有其他 16 位内存寻址模式的默认段[bp+di+immediate]。所以基本上,除非您bp在间接寻址中使用,否则默认段是ds. 如果bp在间接寻址中使用,则默认段为ss.

  2. 十六进制数字中的前导零是许多反汇编程序和汇编程序语法用来将十六进制数字与符号分开的约定(其他一些反汇编程序和汇编程序使用0x代替0)。前导零不会影响任何数字的数值,并且在所有数字系统(二进制、十进制、十六进制等)中都是相同的。

正如您所假设的,将第一个单词加载到and 并将第二个单词加载到中,所以它相当于:lesdi, ss:[bx]dies

mov di,ss:[bx]
mov es,ss:[bx+2]
于 2013-03-14T18:28:18.583 回答