【问题标题】:Understanding assembly data segment x86 MASM了解汇编数据段 x86 MASM
【发布时间】:2015-02-14 01:11:57
【问题描述】:

我在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”。这样做的目的/方法是什么?为什么这些值在这里?它们是某种缓冲区吗?如果是,它们分别代表什么?

【问题讨论】:

    标签: assembly x86 masm


    【解决方案1】:

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

    为什么它们是必要的?

    为了理解这一点,你必须让时钟倒退几十年。我说的是 1960 年代和 1950 年代。

    您还需要考虑电话费用;这实际上是当时连接计算机的唯一且唯一的方法。 (是的,有 1% 的先驱公司拥有微波炉,但对于另外 99% 的公司来说,手机是城里唯一的游戏。)

    现在,挖掘一下:在那时,可视屏幕比机械打印机贵得多。在这种经济条件下,计算机操作员坐在终端前拿着纸记录每一次击键并不稀奇。以及所有在纸上产生输出的软件。

    在您的脑海中记住这个图像:我不是在谈论纸张输出,例如您现在可能习惯的那种;不;不是具有五种字体和彩色图形的格式精美的激光或喷墨副本(哈哈,当时我们甚至不知道如何希望这样的机器)。

    相反,我说的是可以做这些事情的物理打印机...

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

    ...就是这样。

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

    打印机是机器人打字机。那时很少有人坐在屏幕前。那些做过的人并没有完全被神化,但肯定比我们这些实际做任何工作的俗人更高的地位和“酷哥们”的态度。

    伴随着这些费用、盛况和环境的是带宽的真正问题。打印机最常使用电话和调制解调器连接到大型计算机,每秒 300 位被认为是“高速”连接。 120 经常用于商业目的。

    在上下文中,我现在准备澄清令人困惑的“为什么?”它在你的脑海里飘来飘去。

    当时的打印机能够处理前面提到的 51 个字符(“A”到“Z”、10 个数字和 15 个“特殊”符号)。

    许多打印机都是根据当时现有的打字机设计的。

    还要了解,这些连接很可能是电话和调制解调器以每秒 120 位的速度传输,而某些“高速”线路的传输速度为 300。

    现在是理解你的关键,准备好了吗? 长途电话费 !!!

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

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

    • 回车
    • 换行
    • 制表符

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

    您知道,在这样的速度和如此高昂的电话费下,仅这三个字符就帮助减少了大量使用电话的时间。

    即,在打印类似...的内容之后

     Parts on way by XYZ Trucking company. Expect Wednesday
    

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

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

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

    要清楚地记住这一点,您需要了解所有这些喧嚣在财务上的紧张程度。一台打印机,通过电话连接到一台计算机,距离只有 75 英里,在不到一年的时间里,公司的成本可能比一辆新车还多。

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

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

    【讨论】:

    • 没有完全回答这个问题,而是一段美丽的历史。感谢您为我解决了这个问题,这解决了这个代码协议是如何产生的相当多的困惑。
    • 这是一个不错的故事,但是 PC 没有使用 ASCII,他们使用 IBM OEM 字符集 (CP437) 的历史部分丢失了。 (是的,很多字符集是 ASCII 的超集,但是,有这么多,重要的是要知道你使用的是哪一个。)
    • @TomBlodget:好点! (以及我的 +1)随着打印机价格下降,因此它们比新车便宜,他们通常使用 ASCII,与 IBM 打印机使用相同的一般想法。
    【解决方案2】:

    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。这只是“故意的巧合”。)

    【讨论】:

    • 好的。很好的答案,但 为什么 他们是必要的,这是我真正想知道的问题。就像10,13,10,13,9strSumIs 的原因是什么?我实际上需要添加这些值的原因是什么?
    【解决方案3】:

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

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

    '\n', '\r' 是行尾,'\0' 是C 字符串结束标记。

    【讨论】:

    • 但为什么这些值对于运行时是必需的?
    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    相关资源
    最近更新 更多