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

Assembly 你好,世界!使用标准段指令,assembly,x86-16,tasm,Assembly,X86 16,Tasm,我已经用简化的段指令编写了“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 S

我已经用简化的段指令编写了“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告诉我“没有入口点”,垃圾字符可能表示缺少数据段的初始化,所以让我们修复这两个问题:

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和其他“假设”不足的地方都需要初始化数据段。

有什么原因导致假设不够吗?@Nicola,我的TASM抱怨说,如果我不使用假设,TASM(,第91页)似乎必须这样做,可能是为了编译器,但不是为了链接器。其他人不需要它,但数据段的所有情况初始化都必须手动完成。@Nicola
假设
不编译为x86指令。这只是TASM的信息,您将段寄存器设置为什么。所以如果你说假设ds:dataSeg,而你没有设置它,你就“撒谎”了。不管怎样,
int21h,9
ds:dx
获取地址,即使您要在程序的其余部分的代码中处处加上其他段的前缀。您是如何创建那个漂亮的跨行箭头的?我真的很感兴趣你是怎么做到的。@JoseManuelAbarcaRodríguez:谢谢。很高兴知道旧的ASCII字符仍在工作。