assembly 汇编中byte和dword的区别是什么以及如何使用它们[duplicate]

aoyhnmkz  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(143)

此问题在此处已有答案

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
t9eec4r0

t9eec4r01#

一个dword占用4个字节,不管你在那里写的数字看起来有多“大”。
例如:

.data myArray dword 1,2,3,4,5

在十六进制编辑器中,如果您查看上述汇编程序的.data部分(.exe文件,而不是源代码文档),您将看到以下内容:

01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
05 00 00 00

同时,如果您有以下情况:

.data myArray byte 1,2,3,4,5

您将在十六进制编辑器中看到01 02 03 04 05
x86有不同的寄存器大小用于从内存加载。当您执行类似mov edx,[esi]的操作时,edx中的e意味着esi是指向您声明为dword的数据的指针。CPU做出此假设并加载edx,就像您在代码中声明了以下内容一样:

myArray dword 0x01030203,0x09080507,0x??????02

我使用问号是因为这些值是未声明的,它们可以是任何值(可能是零,但谁知道呢)。
重要的是CPU * 不知道你的数据实际是什么类型。* 它依赖于程序员使用正确的目标寄存器大小来加载和存储。幸运的是,这是一个相当容易的修复。

MOV DL,[ESI]  ;you can also use MOV DH,[ESI]

通常,“主寄存器”axbxcxdx遵循以下模式:

  • ax是一个16位寄存器。它是eax的“低半部分”。
  • eax是一个32位寄存器。它是rax的“低半部分”。
  • alax的“低半部分”,而ah是ax的“高半部分”。

相关问题