【问题标题】:Hello World! with standard segment directives你好世界!使用标准段指令
【发布时间】:2017-05-06 00:33:50
【问题描述】:

我写了“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

【问题讨论】:

    标签: assembly x86-16 tasm


    【解决方案1】:

    我的 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,如果我不使用假设,我的 TASM 会抱怨,它似乎对 TASM 是强制性的(bitsavers.informatik.uni-stuttgart.de/pdf/borland/…,第 91 页),可能对于编译器但不是对于链接器。其他不需要,但数据段的所有情况初始化必须手动完成。
    • @Nicola assume 不能编译为 x86 指令。这只是 TASM 的信息, 将段寄存器设置为什么。因此,如果您说 ASSUME ds:dataSeg,但您没有设置它,那么您就“撒谎”了它。无论如何,int 21h, 9ds:dx 获取地址,即使您将编写程序的其余部分并在任何地方都以其他段为前缀。
    • 你是如何创建漂亮的跨行箭头的?我真的很感兴趣你是怎么做到的。
    • @JoseManuelAbarcaRodríguez:谢谢。很高兴知道旧的 ASCII 字符仍在工作。
    猜你喜欢
    • 2021-11-19
    • 2016-06-03
    • 2016-08-14
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多