Assembly 你好,世界!使用标准段指令
我已经用简化的段指令编写了“Hello World!”代码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
.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字符仍在工作。