3
因此,這可能是一個具體問題,但我的ASM分配是創建一個10個元素的數組,將第一個元素添加到最後一個元素,並將結果放入數組的第一個元素,然後第二個元素與第九一個,並將結果在所述陣列的所述第二元件等更改edi的偏移量與更改地址處的值?
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
這不是我正在用的方向,但是當我用這種方式嘗試時,我至少得到了實數,而不是地址。但輸出對我來說並不正確,用1,2,3,4,5,6,7,8,9,0我得到1,5,1,4,5,6,7,8,9, - 1 –
當你使用它時,你將ecx放大4倍,所以你應該只將它減少2(或者初始化爲9 * 4'並且移除有效地址中的* 4',這可能會更容易讀書)。否則,循環只運行2次迭代(ecx = 9和ecx = 1)。 @ Io-stream:如果你沒有自己解決這個問題,試試吧。 –
好的!因此,我的最後的代碼是 MOV EDI,intarray OFFSET MOV ECX,9;所述陣列 再在10個元件: MOV EAX,[EDI] MOV EBX,[EDI + ECX * 4] 添加[EDI],EBX sub [edi + ecx * 4],eax add edi,4 sub ecx,2 jnb再次 它的工作原理!非常感謝你們! –