繁体   English   中英

了解程序集数据段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包含“早上好”,但前面是'10,19,3',后面是',0'。 这个的目的/方法是什么? 为什么这些值在这里? 它们是某种缓冲区,如果是这样,它们代表什么?

我想我可能会对你的困惑感到疑惑。

为什么他们有必要?

为了理解这一点,你必须将时钟运行几十年。 我说的是在20世纪60年代和50年代。

你还需要考虑电话的钱; 这实际上是当时连接计算机的唯一途径。 (是的,有1%的先锋公司使用微波炉,但另外99%的手机是城里唯一的游戏。)

现在,挖掘一下:从那时起,可视屏幕远比机械打印机贵得多。 有了这些经济效益,计算机操作员坐在一个记录每次按键的纸张记录终端时并不罕见; 以及所有在纸上生成输出的软件。

把这个图像记在脑子里:我不是在谈论纸张输出,例如你最近习惯的那种; 没有; 不与五笔字型和颜色的图形格式良好的激光或喷墨复印(哈哈,我们甚至不知道如何为这样一台机器WISH当时)。

相反,我在谈论一台可以做这些事情的物理打印机......

  • 打印26个字符
  • 打印10位数
  • 打印约15个“特殊”字符,如:!@#$?* + /

......那是关于它的。

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

打印机是一台机器人打字机。 当时很少有人坐在屏幕前。 那些做过的人并没有完全神化,但肯定归因于更高的地位和“冷静的家伙”态度,而不仅仅是我们实际做了任何工作的俗人。

除了这种费用和盛况以及环境之外,还有带宽的真正问题。 打印机最常使用电话和调制解调器连接到大型计算机,每秒300位被认为是“高速”连接。 120经常用于商业目的。

有了这些背景,我现在准备澄清令人困惑的“为什么?” 那是浮在你脑海里的。

当时的打印机能够使用前面提到的51个字符(“A”到“Z”,十个数字和十五个“特殊”符号)。

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

还要明白,连接很可能是每秒120比特的电话和调制解调器,以及一些300的“高速”线路。

现在,为了你理解的关键,准备好了吗? 长距离电话费

这一切如何一起玩?

程序员和公司需要一种方法来告诉打印机将打印头放在哪里打击纸张(通过墨带;不要开玩笑),为此,他们组成了三个特殊的控制字符......

  • 回程
  • 换行
  • 制表符

后来,他们又装了一个口袋; 调用集合“ASCII”(你可以谷歌它,如果你真的喜欢历史;非常整洁的东西,真的,但回到主题)。

你看,就像这样的速度和如此高的手机费用,这三个角色本身就有助于消除手机上的大量时间。

即,打印后的东西......

 Parts on way by XYZ Trucking company. Expect Wednesday

...这是55个字符长,你需要多达77个空格来让打印头循环回到开始。

另一个例子是tab键; 其中一个字符消除了九个连续空格的需要。 (请记住,这些都是固定宽度的字体;它是打字机/机器人。)

由于这一切,消息的格式是您正在观察的方式。 这是所有令人困惑的代码的根源。 根据今天的标准,打印机非常粗糙(但相信我,被认为是当时的高科技奇迹盒),因此,每次都需要指示何时,何地以及如何打印下一条消息。

为了清楚地了解这一点,你需要了解所有这些喧嚣的财务状况。 一台打印机通过电话连接到一台距离75英里远的计算机,可能会花费不到一年的时间,而不是一辆新车。

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

当我们从物理纸张打印机转移到显示屏幕(我有一个可以在冬天加热我的房间的CRT)时,那些原始的格式化字节对程序员来说仍然有用; 这就是你今天看到它们使用的原因。

这些常量只是ASCII控制代码:

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

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

10,13,9是字符代码 - 最有可能用于换行(LF),回车(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。这只是“故意巧合”。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM