【问题标题】:What is the difference between defining string as bytes (db) and defining strings as words/double words(dw/dd) in x86在 x86 中将字符串定义为字节(db)和将字符串定义为单词/双字(dw/dd)有什么区别
【发布时间】:2015-01-17 19:57:05
【问题描述】:

我正在尝试研究在程序集中定义标签之间的区别,这是一个示例

ALabel: db 'Testing'
AAnotherLabel: dw 'Testing'

现在,让我将它们加载到 32 位寄存器中:

mov eax, [ALabel]
mov ebx, [AAnotherLabel]

通过 gdb 调查,我发现 eax 和 ebx 的所有子寄存器都包含相同的值,请看这里:

info register eax
0x64636261 //dcba

info register ebx
0x64636261 //dcba

它们是一样的!

在 Jeff Duntemann 的书(Assembly Language step-by-step programming with Linux)中他展示了将字和双字放入寄存器的示例,但由于某种原因加载了偏移量(即像这样的值的地址)

DoubleString: dd 'Stop'
mov edx, DoubleString

对 edx 内容的调查显示它包含一个地址,可能是字符串中前四个字母的地址,与仅第一个字母的地址相对,尽管我在这里推测。

我想澄清一下这里到底发生了什么,这个语句实际上是否将字符串中第一个字母的地址加载到寄存器中:

Fin: db 'Final'
mov ecx, Fin

【问题讨论】:

    标签: linux assembly x86 nasm


    【解决方案1】:

    您在这里谈论的是两件不同的事情。

    db、dw、dd的区别
    Jester已经给你正确的答案了。这是 NASM 手册中的两个示例,应该可以帮助您理解它。

    当您使用 dw 时,以 1 个字(2 个字节)为单位创建存储。因此,它只能具有 2、4、6、8... 等字节的大小。在此示例中,您有一个 3 字节的字符串“abc”。它只需要 3 个字节,但是因为您使用了 'dw',所以它将是 4 个字节长。 4.字节用0填充。

    fin: dw 'abc'               ; 0x61 0x62 0x63 0x00 (string)
    

    通过使用 db 而不是 dw,您可以以 1 字节为单位创建存储。这个长度为 3 个字节:

    fin: db 'abc'               ; 0x61 0x62 0x63 (string)
    

    它们被称为伪指令,因为实际上,它们是您的汇编器(在本例中为 NASM)中的命令,它告诉他如何分配您的存储空间。它不是您的处理器必须读取的代码。来源:
    3.2.1:http://www.nasm.us/doc/nasmdoc3.html

    括号和无括号
    您谈到的另一件事是是否使用方括号 []。这又涉及到 NASM 的语法。当你不使用括号时,你告诉 NASM 使用地址。这会将内存地址保存在eax中:

    mov eax, fin
    

    这会将内存地址的前 4 个字节保存在 eax 中:

    mov eax, [fin]
    

    关于你的最后一个问题:

    DoubleString: dd 'Stop'
    mov edx, DoubleString
    

    DoubleString,保存'Stop'的内存地址保存在edx中。每个地址对应一个字节。因此地址DoubleString 直接指向字母'S'。地址Doublestring+1 指向下一个字节,其中存储了字母't',依此类推。

    来源:
    2.2.2:http://www.nasm.us/doc/nasmdoc2.html#section-2.2.2

    【讨论】:

    • 我相信内存寻址的其他方式,但很好的回答演示,谢谢
    • @william 绝对。我修好了。
    【解决方案2】:

    唯一的区别是存储大小。 dw 将始终使用多个 2 字节,而 dd 将使用 4

    是的,您的最后两个示例加载了地址。

    【讨论】:

    • 您好,感谢您的回复:) 您能否提供一个简单的示例。我理解你的解释,但我无法真正想象这如何/为什么会有很大用处。
    • 说实话,我真的想不出这可能有用的情况。也许如果你想对齐多个字符串,但懒得写出对齐指令:)
    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多