我正在尝试手工完成第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 循环常量中的高/低字节?