了解程序集数据段x86 MASM

时间:2015-02-14 01:11:58

标签: assembly 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,13,9'并由' 0'继承。这个的目的/方法是什么?为什么这些值在这里?它们是某种缓冲区,如果是,那么它们代表什么?

3 个答案:

答案 0 :(得分:4)

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

为什么他们有必要?

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

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

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

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

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

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

......就是这样。

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

打印机是机器人打字机。当时很少有人坐在屏幕前。那些做过的人并没有完全神化,但肯定归因于更高的地位和#34;酷的家伙"态度比我们仅仅是俗人,他们实际上做了任何工作。

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

在所有这些背景下,我现在准备澄清令人困惑的"为什么?"那是在脑海里漂浮着。

当时的打印机能够使用前面提到的51个字符(" A"通过" Z"十位数,十五"特殊"符号)

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

同样明白,连接最有可能是电话和调制解调器以每秒120比特的速度闪烁,而某些"高速"做300行。

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

这一切如何一起玩?

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

  • 回程
  • 换行
  • 标签字符

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

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

即打印出像......之后的东西。

 Parts on way by XYZ Trucking company. Expect Wednesday

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

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

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

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

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

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。它只是一个"故意巧合。")