【问题标题】:x64 MASM array modificationx64 MASM 数组修改
【发布时间】:2015-05-09 23:19:15
【问题描述】:

所以当我为我的问题寻找答案时,我看到了这篇文章: Modifying a character array, the modified part shows up backwards

假设我有一个数组:

.data
array .quad 0,0,0,0

要修改数组中的数据,我需要使用以下代码:

lea rbx, array
mov QWORD PTR[rbx], 1
mov QWORD PTR[rbx-8], 2
mov QWORD PTR[rbx-16], 3
mov QWORD PTR[rbx-24], 4

如果这是正确的,它会产生1, 2, 3, 4吗?

【问题讨论】:

  • 不,您需要使用正偏移量。链接问题中的问题是 dword 中的字节顺序(字节序)。
  • 好吧,但是获取有效地址并将其用作访问数组中数据的基指针的逻辑,他们只是修改该指针是我应该做的吗?
  • 行得通,是的,但是对于编译时地址,您可以只写诸如mov qword ptr [array+8], 2之类的东西

标签: assembly 64-bit x86-64 masm


【解决方案1】:

字节序,即多字节数据类型中的字节顺序,是汇编语言初学者难以理解的概念。

当您将多字节数据类型(worddoublewordquadword)移动到内存地址时,处理器会存储该地址以提供的字节的相反顺序。这样在存储数据时:

mov     qword ptr [rbx], 1      ;provided      00 00 00 00 00 00 00 01h
                                ;stored as     01 00 00 00 00 00 00 00h

对于数据的检索:

mov     rax, qword ptr [rbx]    ;provided      01 00 00 00 00 00 00 00h
                                ;retrieved as  00 00 00 00 00 00 00 01h

但是,当手动保存每个单独的字节时,结果与代码的外观相对应。

mov     byte ptr [rbx], 1
mov     byte ptr [rbx+1], 2
mov     byte ptr [rbx+2], 3
mov     byte ptr [rbx+3], 4

                                ;stored as     01 02 03 04h

为了回答您的问题,quadwords 的用法是:

mov     qword ptr [rbx], 1
mov     qword ptr [rbx+8], 2
mov     qword ptr [rbx+16], 3
mov     qword ptr [rbx+24], 4

                                ;stored as     01 00 00 00 00 00 00 00h
                                               02 00 00 00 00 00 00 00h
                                               03 00 00 00 00 00 00 00h
                                               04 00 00 00 00 00 00 00h

请注意,我使用了加法运算符而不是上面示例中提供的减法。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多