所以,当我查找我的问题的答案时,我发现了这篇文章: 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
?
答案 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
请注意,我使用了上述示例中提供的加法运算符而不是减法。
希望这有帮助。