我已经使用简化的段指令编写了“Hello World!”代码。
.MODEL small
.STACK
.DATA
msg DB 'Hello, World!', 0Dh, 0Ah, '$'
.CODE
.STARTUP
LEA DX, msg
MOV ah, 9
INT 21h
MOV ah, 4Ch
INT 21h
END
但是我在使用标准指令编写相同代码时,可能写错了什么(或者漏掉了某些内容)。代码会打印一堆符号,只有最后才会出现句子“Hello World!”。我错过了什么?
myData SEGMENT
msg DB 'Hello, World!', 0Dh, 0Ah, '$'
myData ENDS
myCode SEGMENT
ASSUME DS:myData, CS:myCode, SS:myStack
LEA DX, msg
MOV ah, 9
INT 21h
MOV ah, 4Ch
INT 21h
myCode ENDS
myStack SEGMENT
myStack ENDS
END
assume
不会编译成 x86 指令。它只是提供给 TASM 的信息,告诉它你设置了段寄存器。所以如果你说 ASSUME ds:dataSeg,但你没有设置它,你就“欺骗”了它。无论如何,即使你在程序的其他地方都使用了其他段前缀,int 21h, 9
也会从ds:dx
中获取地址。 - Ped7g