1

我正在尝试手工完成第3.6.7 节在组装艺术中的自我修改代码练习,并且不禁认为我在高/低字节交错方面做错了什么(我知道作者是如何这样做是为了他想象中的 x86 变体)或者文本中有错误。

也就是说,文中的程序是

   sub  ax, ax
   mov  [100], ax

a: mov  ax, [100]
   cmp  ax, 0
   je   b
   halt

b: mov  ax, 00c6
   mov [100], ax
   mov  ax, 0710
   mov [102], ax
   mov  ax, a6a0
   mov [104], ax
   mov  ax, 1000
   mov [106], ax
   mov  ax, 8007
   mov [108], ax
   mov  ax, 00e6
   mov [10a], ax
   mov  ax, 0e10
   mov [10c], ax
   mov  ax, 4
   mov [10e], ax
   jmp 100

据说“将以下代码写入位置 100,然后执行它:”

   mov  ax, [1000]
   put
   add  ax, ax
   add  ax, [1000]
   put
   sub  ax, ax
   mov [1000], ax
   jmp 0004  

但是,由于多种原因,这对我来说没有意义(首先,它将 00 写入字节 100,这是一条应该跳转到的非法指令;其次,地址中的高/低位字节似乎被切换等)另一方面,如果我只是mov ax, c在 b 循环中的语句中交换高/低位字节,那么这似乎是正确的。所以:

我错了(如果是,为什么?)还是应该交换 b 循环常量中的高/低字节?

4

1 回答 1

2

它不会在地址 100 存储 00,因为 x86 处理器是“小端”。当您将 00c6 存储为一个字时,首先存储 c6。

另一方面,自修改代码已经过时了很长时间。在现代处理器上,您不能写入代码段,也不能执行数据(至少在不跳过大量循环的情况下是这样)。另一个问题是指令缓存可能在您更改它之前很久就加载了未修改的代码。

您要么冒着执行旧代码的风险,要么必须刷新所有缓存,这会对性能产生巨大影响。简而言之 - 自我修改代码是不值得的。自从 1980 年代初的 PC/XT 以来,我就没有使用过它。

你为什么不跳过书中的一章?

于 2012-09-13T20:29:06.377 回答