我需要将每个手动输入数组一个一个地写入屏幕,但是当我尝试将第一个数组(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个单词以小端格式存储):
1,0,2,0,3,0,4,0,5,0,6,0 array
^ ^ ^ ^ ^ ^
0 1 2 3 4 5 index
当执行任务将第五个数组元素与第二个数组元素交换时,您正确使用了数组元素索引4和1,因为所有索引均从零开始。现在,汇编编程中的数组寻址不使用元素indexes,而是依赖于元素offsets。这就是为什么将索引乘以[C0]。太糟糕了,与第二个数组元素交谈时,您忘了写下此比例因子。这就是发生的情况:
[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个元素!