汇编实战四
前言
这样是会报错的
错误是invalid instruction operands
改成MOV AX,X
还是会报一样的错误
这样就挺对的,结果也挺好的
注意咱们这个程序模板后面,是:
MOV AH,4CH
咱们也知道这个就是固定的,是格式
但是这个格式会使得AX的高两位,也就是AH的值是4CH
我一开始写的是MOV AH, X+3
但是怎么试,在debug里看到的结果都是AX=4C11
我还奇怪呢,其实就是最后两句固定格式又把AH的值给改了
还有一个需要注意的地方,就是
MOV AH, X和MOV AH, [X]是一样的,因为X本来就是地址。
这个博客写了两个32位的数相加
所以你再看一下这个为什么不对
问题根本不在加不加[ ]
问题在于你这个X,他是个双字型数据,或者说双字型数据的地址。(这个不重要了,关键不在于它到底代表数据还是地址了,你就当他指向一个内存单元。)
根据这里说的
MOV AX, X 的具体意义要看 X 的类型。如果它是定义的数据变量,那么就是和 mov ax, word ptr x 功能一样;只是后者在 x 不是定义为 word 类型时,避免提示警告甚至是错误。
如果 X 定义的是个标号,如楼主所表示的,那么它就和 mov ax, offset x 是一样的,与mov ax, word ptr x 完全不是一样意思。
关键看第一段,
只是后者在 x 不是定义为 word 类型时,避免提示警告甚至是错误。
所以我们要说明word ptr x
我们之前一直说
X DB 40 DUP (‘A’)
是定义了一段内存区域,首地址是X
这个是非常确定的,是我们一直在说的。
标号有两个属性,段基地址、偏移地址
变量有三个属性,段基地址、偏移地址和数据类型
这里的标号说的是next:这种标号
变量指的就是X DB 40 DUP (‘A’)中的X这种标号
也就是说X,这个变量,他有这么多属性,它知道自己的地址,而且非常详细,并且它也知道自己的数据类型。
因此
X DD 0000H
MOV AX, X
这样是不行的!
X本身有数据类型的属性,这与AX是不匹配的。
你还可以感受到
X DB 11H
MOV AL, X
和
MOV AL, [X]
是一样的
并且和
MOV AL, [BX]
也很类似
[BX]是把BX里的数当成地址
X本身就是个地址
因为X是变量,变量有地址属性