Assembly 如何逐个显示阵列号(Irvine 32库Visual Studio 2019 ASM)

Assembly 如何逐个显示阵列号(Irvine 32库Visual Studio 2019 ASM),assembly,visual-studio-2019,irvine32,Assembly,Visual Studio 2019,Irvine32,我需要一个接一个地将每个手动输入数组写入屏幕,但当我尝试写入第一个数组(0)时,我会在屏幕上得到5的输出。我还需要将第五个数组的值交换到第二个数组,我相信这是正确的。 当程序运行时,它告诉我输入数字,所以我输入1,2,3,4,5,6,但是 我的输出是5?应该是1。 这是我的密码: ExitProcess proto,dwExitCode:dword .data ;// write your data in this section myArray WORD 6 DUP(? )

我需要一个接一个地将每个手动输入数组写入屏幕,但当我尝试写入第一个数组(0)时,我会在屏幕上得到5的输出。我还需要将第五个数组的值交换到第二个数组,我相信这是正确的。 当程序运行时,它告诉我输入数字,所以我输入1,2,3,4,5,6,但是 我的输出是5?应该是1。 这是我的密码:


ExitProcess proto,dwExitCode:dword

.data       ;// write your data in this section

myArray WORD 6 DUP(? )
prompt BYTE "Enter a number", 0dh, 0ah, 0
prompt1 BYTE "The number at position 0 is ", 0dh, 0ah, 0
prompt2 BYTE "The number at position 1 is ", 0dh, 0ah, 0
prompt3 BYTE "The number at position 2 is ", 0dh, 0ah, 0
prompt4 BYTE "The number at position 3 is ", 0dh, 0ah, 0
prompt5 BYTE "The number at position 4 is ", 0dh, 0ah, 0
prompt6 BYTE "The number at position 5 is ", 0dh, 0ah, 0



.code       ;// write your program here
main proc




    mov edx, OFFSET prompt
    call WriteString
    call ReadInt
    mov myArray[0], ax

    call WriteString
    call ReadInt
    mov myArray[1 * SIZEOF WORD], ax

    call WriteString
    call ReadInt
    mov myArray[2 * SIZEOF WORD], ax

    call WriteString
    call ReadInt
    mov myArray[3 * SIZEOF WORD], ax

    call WriteString
    call ReadInt
    mov myArray[4 * SIZEOF WORD], ax

    call WriteString
    call ReadInt
    mov myArray[5 * SIZEOF WORD], ax

    mov ax, myArray[4 * SIZEOF WORD]
    xchg myArray[1], ax
    movzx eax, myArray[1]
    call WriteDec
    call Crlf


    mov edx, OFFSET prompt1
    call WriteString

    mov myArray [0 * SIZEOF WORD], ax
    call WriteDec
    call Crlf 
当我使用mov myArray[0*SIZEOF WORD]时,ax得到“位置0处的数字是5”,但它应该是1。 当我使用
mov-ax,myArray[0]
而不是
mov-myArray[0*SIZEOF-WORD],ax
时,我得到了“位置0处的数字是1281”。我很困惑,为什么第一个数组写入屏幕的不同方式会有不同的输出?
请帮助我将第一个数组正确写入屏幕。

为其输入6个值的数组将包含这12个字节(6个字以little-endian格式存储):

当任务是将第五个数组元素与第二个数组元素交换时,您正确地使用了数组元素索引4和1,因为所有索引都从零开始。
现在,汇编编程中的数组寻址不使用元素索引,而是依赖于元素偏移量。这就是将索引乘以WORD的大小的原因。很遗憾,在与第二个数组元素交谈时,您忘记写入此比例因子。
事情是这样的:

mov ax,myArray[4*SIZEOF WORD]
读取偏移量8处的单词,因此
ax
变为0005h

1,0,2,0,3,0,4,0,5,0,6,0  array
  ^             ^
  1             8        offset
xchg myArray[1],ax
在偏移量1处写入
ax
,从而覆盖第一个和第二个数组元素的一部分

1,5,0,0,3,0,4,0,5,0,6,0  array
  ^             ^
  1             8        offset
movzx eax,myArray[1]
不检索第二个数组元素,因为即使1是正确的索引,它也不是正确的偏移量。这就解释了为什么会显示5


当我使用mov myArray[0*SIZEOF WORD]时,我得到“位置0处的数字是5”,但它应该是1

只是因为您没有实际加载
EAX
寄存器中的第一个元素!您错误地写入第一个元素,然后显示
EAX
中发生的任何内容。这就是5的值

当我使用mov-ax,myArray[0]时,我得到“位置0处的数字是1281。”

这次您正确地读取了第一个元素,但是考虑到程序的
xchg
部分中断了第一个和第二个元素,您只能获取其中的内容

1,5,0,0,3,0,4,0,5,0,6,0  array
^
0                        offset
低字节为1,高字节为5。它们一起产生1281(1+256*5)


试试这个:

; exchange the fifth and second elements
mov     ax, myArray[4 * SIZEOF WORD]   ; read 5th element
mov     dx, myArray[1 * SIZEOF WORD]   ; read 2nd element
mov     myArray[4 * SIZEOF WORD], dx   ; write new 5th element
mov     myArray[1 * SIZEOF WORD], ax   ; write new 2nd element

; print the first element
mov     edx, OFFSET prompt1
call    WriteString
movzx   eax, myArray[0 * SIZEOF WORD]   ; read 1st element
call    WriteDec
call    Crlf 

请注意,在这里交换这两个元素确实符合它所说的。您的代码只复制了第五个元素而不是第二个元素

myArray[1]
是错误的,因为它引用了单词的上半部分。不清楚您想在那里做什么。@Jester For myArray[1]我试图做的是为数组的第二个值输入一个数字,存储它,然后打印到屏幕上。您将该值读入
mov myArray[5*SIZEOF WORD]
中,然后出于任何原因交换
myArray[4*SIZEOF WORD]
。无论如何,为了得到第二个数字,你忘了
*SIZEOF WORD
@Jester,我交换了
myArray[4*SIZEOF WORD]
,无论出于什么原因,这样我就可以用第二个数组值交换第五个数组值——因此代码
mov ax,myArray[4*SIZEOF WORD]xchg myArray[1],ax movzx eax,myArray[1]call WriteDec call Crlf
@Jester第二,我不想在这里得到第二个号码,我想得到第一个。我需要输入第一个数组值,存储它,然后在屏幕上打印它。至于单词的
*SIZEOF
我忘记了,我把它放在第一个
mov myArray[0]
中,仍然得到相同的输出。
; exchange the fifth and second elements
mov     ax, myArray[4 * SIZEOF WORD]   ; read 5th element
mov     dx, myArray[1 * SIZEOF WORD]   ; read 2nd element
mov     myArray[4 * SIZEOF WORD], dx   ; write new 5th element
mov     myArray[1 * SIZEOF WORD], ax   ; write new 2nd element

; print the first element
mov     edx, OFFSET prompt1
call    WriteString
movzx   eax, myArray[0 * SIZEOF WORD]   ; read 1st element
call    WriteDec
call    Crlf