您遇到的问题源于 A86 是单通道汇编程序这一事实。当您使用类似符号时testz
,second
在定义它们之前,A86 必须猜测它们是什么。它假定它们将是立即值,但后来它发现它们实际上是标签。一个多阶段汇编器可能会返回并改变它之前做出的决定,但 A86 不会这样做。它只是抛出一个错误(#16)。这就是错误出现在定义附近的源文件中的原因:这就是 A86 发现问题时所在的位置。
您可以使用指令offset
、d
、w
等明确地告诉 A86 您希望它做什么,因此它不必进行猜测。
A86手册说明:“重要提示:你必须了解标签和变量之间的区别,因为如果你混淆它们,你可能会生成与你预期不同的指令。例如,如果你声明 XXX: DW ?,那么 XXX 后面的冒号表示 XXX 是标签;指令 MOV SI,XXX 将 XXX 的立即常数地址移动到 SI 寄存器中。另一方面,如果您声明 XXX DW ? 不带冒号,则 XXX 是字变量;同样的指令 MOV SI,XXX现在做了一些不同的事情:它将内存字 XXX 的运行时值加载到 SI 寄存器中。您可以使用立即值运算符 OFFSET 或内存变量运算符 B,W 覆盖任何用法中的符号定义, D、Q 或 T。因此,无论 XXX 是如何声明的,MOV SI,OFFSET XXX 都会加载指向 XXX 的立即数;MOV SI,无论 XXX 是如何声明的,XXX W 都会在 XXX 处加载单词变量。”
这应该回答您的第二个问题:当 A86 看到add bl, [second]
它时,它假定second
它将是一个立即字节大小的操作数,因为bl
它是一个字节大小的寄存器。
你的下一行mov bx, second
应该second
是一个立即字大小的操作数,但 A86 已经做了second
一个字节的注释,所以你得到错误 #13。
你可以通过这样做得到你想要的:
add bl, second b ; add the byte at memory location ds:second to bl
mov bx, offset second
通常,如果您在使用符号之前定义它们,这些问题就会消失。例如,这将起作用:
name example1 ; good code
code segment
org 0100h
main: ; - MACHINE CODE
mov bx, main ; BB0001 - put 0100h in bx
mov bx, offset main ; BB0001 - put 0100h in bx
; ^ offset directive not needed here
; A86 already knows what to do
mov bx, [main] ; 8B1E0001 - put 00BBh in bx
; ^ brackets work fine to dereference main here
mov bx, main w ; 8B1E0001 - put 00BBh in bx
; ^ w does the same thing as brackets
org 0150h
goodbye:
int 020h
code ends
end main
但这不起作用:
name example2 ; will not assemble
code segment
org 0100h
main: ; - MACHINE CODE
mov bx, goodbye ; BB5001 - put 0150h in bx
; ^ A86 assumes goodbye is an immediate value. This assumption
; turns out to be a good one, so this line works OK
mov bx, offset goodbye; BB5001 - put 0150h in bx
; ^ offset directive tells A86 that goodbye will be an immediate
; value. You can skip it, since A86 assumes that anyway
mov bx, [goodbye] ; this line is the culprit!
; ^ A86 doesn't know what to do about these brackets
mov bx, goodbye w ; 8B1E5001 - put 20CDh (`int 020h`) in bx
; ^ w directive tells A86 that goodbye will be a word
; variable
org 0150h
goodbye: ; label goodbye not defined until way down here!
int 020h
code ends
end main