Assembly 带过程的汇编传递字节数组

Assembly 带过程的汇编传递字节数组,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,我需要在这里使用字节数组,我看到的问题是我无法正确地访问数组中的每个元素。这一切都应该指向数组并通过1字节整数递增,但它在第一个元素上不是偶数,然后在调试和查看内存地址时意外地跳转。我想知道我是否遗漏了一些明显的东西。我已经尝试了好几天让程序逐步通过每个元素。我们的目标是与testArray进行比较,但我无法使用过程逐步遍历数组。我已经能够在没有过程的情况下完成所有这些,并且现在尝试通过过程来实现这一点。有很多问题。这个程序甚至没有汇编。至少在程序validateArray的末尾缺少ret,在m

我需要在这里使用字节数组,我看到的问题是我无法正确地访问数组中的每个元素。这一切都应该指向数组并通过1字节整数递增,但它在第一个元素上不是偶数,然后在调试和查看内存地址时意外地跳转。我想知道我是否遗漏了一些明显的东西。我已经尝试了好几天让程序逐步通过每个元素。我们的目标是与testArray进行比较,但我无法使用过程逐步遍历数组。我已经能够在没有过程的情况下完成所有这些,并且现在尝试通过过程来实现这一点。

有很多问题。这个程序甚至没有汇编。至少在程序validateArray的末尾缺少ret,在main的末尾缺少ExitProcess,在程序的末尾缺少end main。我猜调用validateArray、ADDR byteArray和循环L5都是打字错误

1调用validateArray,ADDR byteArray显然是一个打字错误。我猜你指的是testArray,下面会这样称呼它

2字节数组是堆栈地址。byteArray[edi]将edi添加到此地址*1是多余的。mov eax,byteArray[edi]从堆栈中加载4个字节。如果EDI=0,则它将包含指向byteArray的指针,否则为垃圾。您必须首先加载byteArray的值,以获取指向testArray的指针。然后可以使用括号取消对其的引用:

INCLUDE Irvine32.inc

.data
testArray BYTE 1,2,3,4,5
array     BYTE 5,4,3,2,1

; Definition
validateArray PROTO byteArray:PTR BYTE

.code
main PROC

INVOKE validateArray, ADDR byteArray
main ENDP

validateArray PROC byteArray:PTR BYTE
    mov esi, byteArray      ; should point to array, but does not
    mov edi, 0
    call DumpRegs

L1:     mov  eax, byteArray[edi * 1]     ; not 5, the first element in the array as expected 
        call WriteDec   
        inc  edi
        call CrLf
        Loop L5
validateArray ENDP
3 mov eax,byteArray[edi*1]将4字节32位加载到eax中,而不考虑表示的类型。在第一次调用更正为右指针后,例如EAX保存testArray的前四个元素的值:1,2,3,4,得到它们的小端:EAX=0x0403001。WriteDec将输出十进制值67305985。由于WriteDec需要EAX,请使用特殊的x86指令将字节加载到dword寄存器中:

mov esi, byteArray          ; ESI: pointer to the first byte of testArray
mov eax, [esi]              ; EAX: dword value at [ESI]
add esi, 1                  ; Pointer to the next byte of testArray
大小说明符字节PTR通知汇编程序它应将一个字节扩展为EAX。MASM不知道,因为它也可以扩展一个单词

如果要将带符号字节扩展为带符号双字,请执行以下操作:

movzx eax, byte ptr [esi]
顺便说一句:如果您的调用是向上引用的,那么您不需要PROTO声明,也就是说,validateArray PROC是在调用之前定义的

我对您的代码进行了一些修改,以获得一个工作程序:

movsx eax, byte ptr [esi]

哦,我的上帝!你真是天赐之物!我从来没有在组装中看到过这样做,也从来没有想过要这样做!非常感谢你!
INCLUDE Irvine32.inc

.data
    testArray BYTE 1,2,3,4,5

.code

validateArray PROC byteArray:PTR BYTE

    mov esi, byteArray
    mov ecx, SIZEOF testArray    ; ecx is needed for loop!

    _Loop:
    movzx eax, byte ptr [esi]    ; movzx: load one unsigned byte in a 32-bit-register
    call WriteDec
    call CrLf
    add esi, 1
    loop _Loop

    ret

validateArray ENDP

main PROC

    INVOKE validateArray, ADDR testArray
    INVOKE ExitProcess, 0

main ENDP

END main