了解程序集数据段 x86 MASM

Understanding assembly data segment x86 MASM

我有一些在 x86 上使用 MASM 进行汇编的示例代码,我正在尝试从中学习,但我很难理解。这是以下数据段:

    .data
sNum1   word    23,-17  
iX      dword   37,54 
sNum2   word    25,-5,3 dup (-17,4)
bVal1   byte    'ABC',3 dup(-1,23) ,35
iNumVals        dword   21,-43,45,167,92,135,-786
bVal2   byte    '345',37,-1
iNum1   dword   ?                           ;user-input first number
iNum2   dword   ?                           ;user-input 2nd number
iSum    dword   ?                           ;sum of user-input values
strPromptName   byte    10,13,"What is your name: ",0
strInput        byte    20 dup(?)           ;holds user-input characters
strGreeting     byte    10,13,9,"Good morning, ",0
strPromptNum    byte    10,13,"Enter a number:",0
strInputNum     byte    12 dup(?)           ;holds input ASCII numbers
strOutputNum    byte    12 dup(?)           ;numeric characters after conversion
strSumIs        byte    10,13,10,13,9,"The output sum is ",0
strArrayIs      byte    10,13,"The values in the array are",0

为什么存储为 byte 的已定义字符串在其字符串值之前包含数字。例如 - strGreeting 包含 "Good morning, ",但前面是“10,13,9”,后面是“,0”。这个 purpose/methodology 是什么?为什么这些值在这里?它们是某种缓冲区吗?如果是,它们分别代表什么?

这些常数只是ASCII控制码:

 0    [=10=]    NUL
 9    \t    TAB
10    \n    NEW LINE
13    \r    CARRIAGE RETURN

'\n','\r'是行尾,'\0'是字符串的C端标记

10、13、9 是字符代码——最有可能用于换行 (LF)、回车 return (CR) 和制表符。作为控制字符,它们用于格式化输出。例如,控制台将如下所示:

What is your name: Tom
        Good morning, Tom
Enter a number:
1
2
3
4

        The output sum is 10 

(顺便说一句,通常的顺序是 CR LF,而不是 LF CR。)

对字符序列进行操作的例程通常使用 0 (NUL) 来确定它们已经读取了序列末尾。

由您 运行 程序中的输出例程和控制台决定这些代码将被解释为哪些字符。在英语 MS-DOS 中,编码可能是 CP437 (IBM OEM)。在英文中 Windows,它可能是 Windows-1252。对于您似乎正在使用的字符,编码与 ASCII 相同。 (即便如此,你的系统使用ASCII的可能性很小。它只是一个"intentional coincidence.")

我想我可能对你的困惑有所了解。

为什么需要它们?

为了理解这一点,您必须 运行 将时钟倒退几十年。我说的是 1960 年代和 50 年代。

你还需要从钱的角度考虑电视phone;这实际上是当时连接计算机的唯一方式。 (是的,有 1% 的先驱公司使用微波炉,但对于其他 99% 的公司来说,phone 是唯一的选择。)

现在,挖掘这个:很久以前,可视屏幕比机械打印机贵得多。在这种经济学盛行的情况下,计算机操作员坐在终端前用纸记录每次击键并不罕见;以及所有在纸上产生输出的软件。

在你的脑海中记住这个画面:我不是在谈论纸质输出,比如你现在可能已经习惯的那种;不;不是带有五种字体和彩色图形的格式精美的激光或喷墨复印件(哈哈,那时我们甚至不知道如何 WISH 这样的机器)。

相反,我说的是可以执行这些操作的物理打印机...

  • 打印 26 个字符
  • 打印 10 位数字
  • 打印大约 15 "Special" 个字符,例如:!@#$?*+/

...仅此而已。

以防万一你错过了,那些“26 个字符”是 "A" 到 "Z" 的大写字母。那些打印机上没有小写字母。

打印机是机器人打字机。那时很少有人坐在屏幕前。那些这样做的人并没有被神化,但肯定比我们这些实际上做任何分配的工作的外行人更高的地位和 "cool dude" 态度。

除了这种费用、排场和环境之外,带宽也是一个非常现实的问题。打印机最常使用远程 phone 和调制解调器连接到大型计算机,每秒 300 位被认为是 "high speed" 连接。 120 经常用于商业目的。

考虑到所有这些,我现在准备澄清在您脑海中浮现的令人困惑的 "why ?"。

当时的打印机能够打印前面提到的 51 个字符("A" 到 "Z"、十位数字和十五个 "special" 符号)。

许多打印机的设计都是对当时现有打字机的改造。

还了解到连接最有可能是远程phones 和调制解调器以每秒 120 位的速度传输,而一些 "high speed" 线路以每秒 300 位的速度传输。

现在是你理解的关键,准备好了吗? 长途 PHONE 账单 !!!

这一切如何一起发挥作用?

程序员和公司需要一种方法来告诉打印机将打印头放置在何处以撞击纸张(通过色带;不是开玩笑)为此,他们制作了三个特殊的控制字符...

  • 马车Return
  • 换行
  • 制表符

后来,他们又添了满满一兜;调用集合 "ASCII"(如果你真的喜欢历史,你可以 google 它;非常简洁的东西,真的,但是,回到主题)。

你看,以这样的速度和如此高的 phone 费用,仅这三个字符就帮助减少了 phone 上的大量时间。

即,打印类似...

 Parts on way by XYZ Trucking company. Expect Wednesday

...长度为 55 个字符,您将需要多达 77 个空格才能使打印头循环回到开头。

再比如tab键;其中一个字符消除了九个连续空格的需要。 (请记住,这些都是固定宽度的字体;它是 typewriter/robot。)

所有这一切的结果是,邮件以您所观察到的方式进行了格式化。这就是所有那些令人困惑的代码的根源。按照今天的标准,打印机非常简陋(但请相信我,它们被尊为当时的高科技神奇盒子),因此,每次都需要关于何时、何地以及如何打印下一条消息的说明。

为了清楚地记住这一点,您需要了解所有这些喧嚣在经济上的紧张程度。一台通过 phone 连接到一台计算机的打印机,即使在短短 75 英里之外,在不到一年的时间里,一家公司的成本可能比一辆新车的成本还高。

今天打印机可能被列为办公费用。当时它们被摊销为资本设备。

当我们从物理纸质打印机转向显示屏幕(我有一个 CRT 可以在冬天为我的房间供暖)时,那些原始的格式化字节对程序员仍然有用;这就是为什么您看到它们至今仍在使用的原因。