Assembly 汇编中的奇怪字符?

Assembly 汇编中的奇怪字符?,assembly,Assembly,我编写了以下代码: .386 .model small .stack 100h .data text db "Paper",0 .code start : lea dx , text mov ah , 9h int 21h mov ah , 4ch int 21h end start end 问题是它在中间显示了正确的句子,奇怪的是什么,到底是什么问题? ; your code start: mov ax, @data mov ds,

我编写了以下代码:

 .386
 .model small
 .stack 100h

 .data
    text db "Paper",0
 .code
  start :

  lea dx , text
  mov ah , 9h
  int 21h

  mov ah , 4ch
  int 21h

  end start

  end
问题是它在中间显示了正确的句子,奇怪的是什么,到底是什么问题?

; your code
start:
mov ax, @data
mov ds, ax
;your code
我想这会解决你的问题。Dos在加载.com文件时,设置
cs
=
ds
=
es
。加载.exe格式时,当然不是这样的,
cs
指向您的代码,但是
ds
(和
es
?)指向您的PSP(程序段前缀),这通常不是数据所在的位置。。。您必须自己设置
ds
(如果要使用它,还必须设置
es

“为什么要学习16位汇编?”是一个很好的问题。“为什么要学习组装?”是另一个好问题。很可能你永远不会用它写任何“严肃”的东西。但它允许您以HLLs不会的方式了解“引擎盖下”发生的事情,16位允许您理解分段内存模型。32位代码也是分段的,但虽然这些段“不同”,但它们通常指向相同的内存,您通常可以忽略它们-操作系统会为您处理所有这些


此外,我们中的一些人疯狂到认为这很有趣

DS:DX=指向以“$”结尾的字符串的指针我忍不住要问:你为什么要在2013年尝试学习16位汇编?@user22323-这意味着你应该阅读规范。如果不是在编码之前,至少是在编码之后,当事情不正常时。@Per Johansson-因为如果你了解汇编程序,你就有机会理解计算,而且大多数人不会从“战争与和平”开始阅读。@PerJohansson:你仍然可以在32位操作系统中运行16位应用程序,很多人仍然在运行32位Windows XP。有大量优秀的汇编语言教程,学习调用DOS中断是一个很好的开始。否则,您必须学习如何设置堆栈框架等,这是一个更高级的主题。16位ASM是一个很好的学习平台,因为它简单。你可以通过在一开始就设置它们,然后离开它们来避免整个细分市场的事情。非常适合学习。在学习16位之后,移动到32位是相当容易的。