如何一一显示数组编号(Irvine 32库Visual Studio 2019 ASM)

问题描述 投票:0回答:1

我需要将每个手动输入数组一个一个地写入屏幕,但是当我尝试将第一个数组(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”。我很困惑,为什么对于将第一个数组写入屏幕的方式有不同的输出?请帮助我将第一个数组正确写入屏幕。

assembly visual-studio-2019 irvine32
1个回答
0
投票

您输入了6个值的数组将保留这12个字节(6个单词以小端格式存储):

1,0,2,0,3,0,4,0,5,0,6,0  array
^   ^   ^   ^   ^   ^
0   1   2   3   4   5    index

当执行任务将第五个数组元素与第二个数组元素交换时,您正确使用了数组元素索引4和1,因为所有索引均从零开始。现在,汇编编程中的数组寻址不使用元素indexes,而是依赖于元素offsets。这就是为什么将索引乘以[C​​0]。太糟糕了,与第二个数组元素交谈时,您忘了写下此比例因子。这就是发生的情况:

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

AX

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

AX

1,5,0,0,3,0,4,0,5,0,6,0 array ^ ^ 1 8 offset 不会检索第二个数组元素,因为即使1是正确的index,也不是正确的offset。这解释了为什么显示5的原因。


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

只是因为您实际上没有将第一个元素加载到movzx eax, myArray[1]寄存器中!您错误地write到第一个元素,然后显示EAX中发生的任何事情。那就是值5。

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

这一次您正确地读取了第一个元素,但是鉴于程序的EAX部分破坏了第一个和第二个元素,因此您只能得到其中的内容。

xchg

低字节1和高字节5。它们共同产生1281(1 + 256 * 5)。


尝试一下:

1,5,0,0,3,0,4,0,5,0,6,0  array
^
0                        offset

[请注意,在这里交换2个元素确实符合它的意思。您的代码仅copied第5个元素超过第2个元素!

© www.soinside.com 2019 - 2024. All rights reserved.