更改 edi 的偏移量与更改地址处的值?
Changing the offset of edi vs changing the value at the address?
所以,这可能是一个具体的问题,但我的 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
读取寄存器中的两个数组元素,然后在请求的数组末尾执行 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
所以,这可能是一个具体的问题,但我的 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
读取寄存器中的两个数组元素,然后在请求的数组末尾执行 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