【问题标题】:Assembly Language: Memory Bytes and Offsets汇编语言:内存字节和偏移量
【发布时间】:2011-09-22 08:38:45
【问题描述】:

我对在汇编语言中声明变量时如何存储内存感到困惑。我有这个示例代码块:

val1  db  1,2
val2  dw  1,2
val3  db  '12'

从我的学习指南中,它说内存中存储这三个数据定义声明的数据所需的总字节数为 8 个字节(十进制)。我该如何计算这个?

它还说 val3 的数据段的偏移量是 6 个字节,偏移量 5 处的十六进制字节是 00。我不知道如何计算这些字节和偏移量。

此外,将 val1 读入内存会产生 0102,但将 val3 读入内存会产生 3132。撇号是由 3 表示还是从哪里来?如何将 val2 读入内存?

【问题讨论】:

    标签: memory assembly byte offset


    【解决方案1】:

    您有两个字节,0x010x02。到目前为止是两个字节。

    那么你有两个 单词, 0x00010x0002。那是另外 4 个字节,迄今为 6 个。

    你还有两个字节组成 string '12' 的字符,它们是 ASCII (a) 中的 0x310x32。这又是两个字节,使总数达到 8 个。

    采用 little-endian 格式(根据您的问题状态的内存值,您在此处查看的内容),它们存储为:

    offset  value
    ------  -----
         0   0x01
         1   0x02
         2   0x01
         3   0x00
         4   0x02
         5   0x00
         6   0x31
         7   0x32
    

    (a) 在这种情况下,您使用的字符集是 ASCII (您可以通过该链接查看描述该集中所有字符的表格)。

    byte0x300x39 是数字 09,就像字节 0x410x5A 代表大写字母字符一样。伪操作:

    db '12'
    

    是说插入字符'1''2'的字节。

    同样:

    db 'Pax is a really cool guy',0
    

    会给你十六进制转储表示:

    addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  +0123456789ABCDEF
    0000  50 61 78 20 69 73 20 61 20 72 65 61 6C 6C 79 20   Pax is a really 
    0010  63 6F 6F 6C 20 67 75 79 00                        cool guy.
    

    【讨论】:

    • 表格+1。但我相信偏移量 1 处的字节应该是 2。
    • @paxdiablo 感谢您提供有用的表格!那么单词总是被向后读入内存吗?你能帮忙解释一下为什么“12”表示为 0x31 和 0x32 吗?
    • @raphnguyen 有两种表示单词的方法。这种向后的顺序称为大端,另一个称为小端。 '12' 是一个字符串。 0x31 和 0x32 是 '1' 和 '2' 的 ASCII 码。
    • @paxdiablo 感谢您的澄清!
    • @raphnguyen:看到更新,希望能更好地解释它。
    【解决方案2】:

    val1 是两个连续的字节,12db 表示“直接字节”。 val2 是两个连续的单词,即 4 个字节,又是 1 和 2。假设您在大端机器上,它们在内存中将是 1, 0, 2, 0val3 是一个两字节的字符串。 3132 是十六进制的 49 和 50,它们是字符“1”和“2”的 ASCII 码。

    【讨论】:

    • 我一直听到它发音为“数据字节”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多