【发布时间】:2017-06-20 21:52:31
【问题描述】:
我正在尝试将一个数组复制到另一个数组,但元素的顺序应该颠倒并显示。我的程序文件编译但不运行,每次都会导致 Windows 停止错误(Windows 对话框)。
我不确定我做错了什么。请指教。
INCLUDE Irvine32.inc
.data
sarray DWORD 500h, 400h, 300h, 200h, 100h
darray DWORD 5 DUP(?)
.code
main PROC
mov eax, 0
mov esi, OFFSET sarray ;move first element address to esi
mov edi, OFFSET darray + SIZEOF darray - TYPE darray ;move last element address to edi
mov ecx, LENGTHOF sarray ;sets the counter in the reverseLoop
reverseLoop:
mov eax,sarray[esi] ;move 1st sarray element to eax
mov darray[edi],eax ;move 1st sarray element as last element on darray
call WriteInt
call Crlf
add esi, TYPE sarray
sub edi, TYPE darray
call WriteInt
loop reverseLoop
exit
main ENDP
END main
编辑:我的问题是esi 和edi 已经添加了地址(OFFSET sarray),但在循环中我再次添加了开始(mov eax, sarray[esi])。
修复后,我不得不添加另一个循环来打印第二个 darray(新的)
【问题讨论】:
-
你有退出循环的条件吗?
-
x86 上的
loop指令将ecx作为计数器递减,如果它变为零则退出。所以,它不是无限的。 -
"我的程序文件在编译后停止工作。"不是一个好的错误描述,请具体说明发生了什么。另外,使用调试器。
-
您的问题是您已经使用地址加载了
esi和edi(您添加了OFFSET sarray)但是在循环中您再次添加了开始(mov eax,sarray[esi])。从其中一个地方删除它。 -
当然,您在用于反转它的同一循环中打印它,因此它是原始顺序。要打印反向的,您需要一个单独的循环来打印它。或者,从后到前处理数组。
标签: arrays assembly x86 irvine32