所以,这可能是一个特定问题,但我的ASM分配是创建一个10元素数组,将第一个元素添加到最后一个元素并将结果放在数组的第一个元素中,然后是第二个元素第9个元素,并将结果放在数组的第二个元素中等。
a0 + a9 ---> A0 a1 + a8 ---> a1等。
相同的过程应从第10个元素中减去第一个元素,并将结果放在第10个元素中。从第9个元素中减去第2个元素,并将结果放在第9个元素中,等等。像这样:
因此,如果输入1,2,3,4,5,6,7,8,9,0作为示例,程序输出应为1,11,11,11,11,1,3 ,5,7,-1。
我在这里完全失败,我不知道如何在edi中绕过OFFSET来回移动以及更改该地址的值?
INCLUDE c:\Irvine\Irvine32.inc
ExitProcess proto,dwExitCode:dword
.data ;// write your data in this section
intarray DWORD ?,?,?,?,?,?,?,?,?,?
msg2 BYTE "The processed array:", 0
endl BYTE 0dh, 0ah, 0
count DWORD 0
x DWORD 0
y DWORD 0
.code
main proc
mov eax, 0 ; zeros out the eax register
mov ecx, LENGTHOF intarray
mov edi, OFFSET intarray;
mov edx, OFFSET endl; moves the location of endl to edx
L1:
call ReadInt ; takes user integer input for the eax register
mov [edi], eax; moves value from the eax register to the edi
add edi, TYPE DWORD; increments the address
Loop L1; restarts first loop
mov edx, OFFSET msg2 ; moves msg2 to the edx register
call WriteString ; Writes the value in the edx register to the screen
mov edx, OFFSET endl ; moves endl (line break) to the edx register
call WriteString ; prints the value in the edx register to the screen
mov ecx, LENGTHOF intarray/2 ;
L3:
Loop L3 ; restarts the loop
mov ecx, LENGTHOF intarray ;
mov edi, OFFSET intarray;
L4:
mov eax, edi;
call WriteInt
add edi, TYPE DWORD; increments the address
loop L4
invoke ExitProcess,0
main endp
end main
答案 0 :(得分:2)
读取寄存器中的两个数组元素,然后在数组请求的末尾执行add
或sub
。
在EDI中使指针前进,但ECX速度降低两倍。
mov edi, OFFSET intarray
mov ecx, 9 ;10 elements in the array
Again:
mov eax, [edi]
mov ebx, [edi+ecx*4]
add [edi], ebx
sub [edi+ecx*4], eax
add edi, 4
sub ecx, 2
jnb Again