你好世界!使用标准段指令

Hello World! with standard segment directives

我用简化的段指令编写了 "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

我的 TASM 告诉 "No entry point",垃圾字符可能表示缺少数据段初始化,所以让我们修复这两个问题:

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" 不够。