标准段指令下的“Hello World!”

3

我已经使用简化的段指令编写了“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
1个回答

3

我的TASM提示“没有入口点”,垃圾字符可能表明数据段未初始化,所以让我们修复两个问题:

myData SEGMENT
msg  DB 'Hello, World!', 0Dh, 0Ah, '$'
myData ENDS

myCode SEGMENT
ASSUME DS:myData, CS:myCode, SS:myStack

begin:              ;◄■■ ENTRY POINT ◄────────┐
                                              │
mov ax, myData   ;◄■■ INITIALIZATION          │
mov ds, ax       ;◄■■ OF DATA SEGMENT.        │
                                              │
LEA DX, msg                                   │
MOV ah, 9                                     │
INT 21h                                       │
                                              │
MOV ah, 4Ch                                   │
INT 21h                                       │
myCode ENDS                                   │
                                              │
myStack SEGMENT                               │
myStack ENDS                                  │
                                              │
END begin          ;◄■■ ENTRY POINT ◄─────────┘

代码底部的“END”指令也表示程序开始执行的地方。在TASM、EMU8086、GUI Turbo Assembler等编译器中,需要初始化数据段,而“ASSUME”不足以满足要求。


ASSUME不够用的原因是什么? - Nicola
@Nicola,如果我不使用assume,我的TASM会报错,似乎对于TASM来说这是强制性的(http://bitsavers.informatik.uni-stuttgart.de/pdf/borland/turbo_assembler/Turbo_Assembler_Version_5_Users_Guide.pdf,第91页),可能是为了编译器而不是链接器。其他汇编器不需要它,但在所有情况下,数据段的初始化必须手动完成。 - Jose Manuel Abarca Rodríguez
@Nicola assume 不会编译成 x86 指令。它只是提供给 TASM 的信息,告诉它你设置了段寄存器。所以如果你说 ASSUME ds:dataSeg,但你没有设置它,你就“欺骗”了它。无论如何,即使你在程序的其他地方都使用了其他段前缀,int 21h, 9 也会从 ds:dx 中获取地址。 - Ped7g
@zx485 Unicode 盒线字符。这个用于水平线,和这个用于垂直线。破折号(—)和竖杠(|)可能也可以使用,而且更容易输入。 - Cody Gray
1
@JoseManuelAbarcaRodríguez:谢谢。很高兴知道旧的ASCII字符仍然可用。 - zx485
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接