x64 MASM数组修改

时间:2015-05-09 23:19:16

标签: assembly 64-bit x86-64 masm

所以,当我查找我的问题的答案时,我发现了这篇文章: 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

1 个答案:

答案 0 :(得分:0)

Endianness,多字节数据类型中的字节顺序,对于汇编语言中的初学者来说是一个难以理解的概念。

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

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

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

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

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

希望这有帮助。