此问题在此处已有答案:
iterate through an array using assembly and find the sum of the elements(1个答案)
昨天关门了。
我有一个汇编程序,它遍历一个数组,并在迭代时计算和。当我将myArray改为byte EDX = 01030203时,而当我将myArray改为DWORD EDX = 00000003时,有人能告诉我为什么会发生这种情况吗
.data
myArray byte 3, 2, 3, 1, 7, 5, 8, 9, 2
.code
main PROC
mov eax, 0
mov ecx, 9
mov esi, OFFSET myArray
top:
mov edx, 0
mov edx, [esi]
add eax, edx
inc esi
dec ecx
jnz top
main ENDP
END main
1条答案
按热度按时间t9eec4r01#
一个
dword
占用4个字节,不管你在那里写的数字看起来有多“大”。例如:
在十六进制编辑器中,如果您查看上述汇编程序的
.data
部分(.exe文件,而不是源代码文档),您将看到以下内容:同时,如果您有以下情况:
您将在十六进制编辑器中看到
01 02 03 04 05
。x86有不同的寄存器大小用于从内存加载。当您执行类似
mov edx,[esi]
的操作时,edx
中的e
意味着esi
是指向您声明为dword
的数据的指针。CPU做出此假设并加载edx
,就像您在代码中声明了以下内容一样:我使用问号是因为这些值是未声明的,它们可以是任何值(可能是零,但谁知道呢)。
重要的是CPU * 不知道你的数据实际是什么类型。* 它依赖于程序员使用正确的目标寄存器大小来加载和存储。幸运的是,这是一个相当容易的修复。
通常,“主寄存器”
ax
、bx
、cx
和dx
遵循以下模式:ax
是一个16位寄存器。它是eax
的“低半部分”。eax
是一个32位寄存器。它是rax
的“低半部分”。al
是ax
的“低半部分”,而ah
是ax的“高半部分”。