【问题标题】:Assembly x86 Irvine WriteString Byte vs Dword大会 x86 Irvine WriteString 字节与 Dword
【发布时间】:2017-04-11 20:02:10
【问题描述】:

我刚刚注意到一些有趣的事情,我正在努力获得更好的理解。 我尝试使用 Irvine WriteString 调用。

写字符串

编写一个以 null 结尾的字符串。
输入:DX 指向字符串的偏移量

INCLUDE Irvine32.inc

.data
    fizz        BYTE    "Fizz",  0

...

MOV EDX, OFFSET fizz
CALL WriteString
CALL CrLf

而且效果很好,我可以在我的窗口中看到“Fizz”,就像在documentation 中一样。

但是,如果我尝试使用 DWORD 而不是 BYTE

fizz        DWORD   "Fizz",  0

我将在提示窗口中看到“zziF”。 据我所知,唯一的区别在于 BYTE 和 DWORD 之间的大小,以位为单位(8 位与 32 位)。 我真的不明白相反的顺序。发生了什么事?

感谢每一个回答!

【问题讨论】:

    标签: assembly byte irvine32 dword


    【解决方案1】:

    您的问题与“Irvine”或“WriteString”完全无关。

    简短的回答是,您所看到的是您在英特尔 x86 架构上编程的直接结果,即 little endian,而您正在使用一些老黑客编写的汇编程序。

    下面是长答案。

    如果您正在处理汇编语言,那么您应该通过在 Wikipedia 或其他地方查找有关 endianness 的所有知识,但简而言之,它定义了字节如何存储在连续的内存位置以形成大于字节的数量。有两种字节序:

    • 大端和
    • 小端序。

    Little endian 意味着在大于字节的数量上,首先存储最低有效(“低”)字节,然后是连续更高有效的字节。因此,在DWORD 中,首先存储最低有效(“低”)字,然后存储最高有效(“高”)字。这与 big endian 正好相反,先存储高字节。你可能会认为大端更直观,因为它更接近于我们人类表示数字的方式,最重要的数字是最左边的数字,后面是次要的数字,但这只是我们人类,它完全是任意的;数字的性质并没有规定数字的重要性应该从左到右或从右到左排序。相反,little endian 有一定的硬件优势,这就是 Intel 为 x86 架构选择的。

    但我离题了。

    所以,这就是正在发生的事情:

    您正在使用的汇编程序试图变得聪明,并允许您使用字符串文字指定 DWORD 的值。这是荒谬的,因为DWORD 应该包含一个 32 位的 数字,而不是字符串,但他们正试图适应肮脏的黑客攻击。这也是完全武断的,因为人们可以想象有很多方法可以实现这样的怪癖,而他们只是选择了一种方法,我想是他们最喜欢的一种。

    因此,显然,他们所做的就是获取您的字符串文字,并将其视为一组四个字符,形成一个DWORD。当然,当他们将DWORD 存储在内存中时,他们会将其存储在 little-endian 中,这适用于 Intel 架构,这意味着您会得到“zziF”而不是“Fizz”。重要的是要理解这个“zziF”是由汇编器嵌入到您的程序中的,并且“WriteString”函数会在看到它时打印它。如果您使用任何其他打印字符串的函数,也会打印相同的内容。这不是函数的错。

    【讨论】:

    • 感谢您的解释!好吧,你明白了我已经尝试将“FizzBu​​zz”存储为 DWORD,但是由于我认为“常量太大”的大小,出现了构建错误。我也不知道尺寸限制。但是,我正在学习字节顺序,但我从来没有想过它会导致这样的事情。所以基本上,使用 Byte 而不是 DWORD 意味着我将有四个字符块作为 BYTE,并且如果我做对了,它会按预期工作。
    • 是的,对于单个字节,字节顺序问题不会发挥作用。至于“太大的常量”,显然汇编器需要一个适合 DWORD 的字符串文字,所以 4 个字符是限制。逗号后面的零被编码为另一个 DWORD,占用另外四个字节。为了好玩,你可以试试看支持QWORD的汇编器;那么,你应该得到zzuBzziF。
    • 谢谢你,你帮了我很多!在我们的学习示例中,我什至没有看到 QWORD,而且我今天刚刚学到了一些新东西。谢谢!现在我可以玩 zzuBzziF了!:) –
    猜你喜欢
    • 2017-10-05
    • 2016-07-09
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多