【问题标题】:Copying an array to another array as reversed and display in Assembly将一个数组反向复制到另一个数组并在Assembly中显示
【发布时间】: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

编辑:我的问题是esiedi 已经添加了地址(OFFSET sarray),但在循环中我再次添加了开始(mov eax, sarray[esi])。

修复后,我不得不添加另一个循环来打印第二个 darray(新的)

【问题讨论】:

  • 你有退出循环的条件吗?
  • x86 上的 loop 指令将 ecx 作为计数器递减,如果它变为零则退出。所以,它不是无限的。
  • "我的程序文件在编译后停止工作。"不是一个好的错误描述,请具体说明发生了什么。另外,使用调试器。
  • 您的问题是您已经使用地址加载了esiedi(您添加了OFFSET sarray)但是在循环中您再次添加了开始(mov eax,sarray[esi] )。从其中一个地方删除它。
  • 当然,您在用于反转它的同一循环中打印它,因此它是原始顺序。要打印反向的,您需要一个单独的循环来打印它。或者,从后到前处理数组。

标签: arrays assembly x86 irvine32


【解决方案1】:

我的问题是esiedi 已经添加了地址OFFSET sarray,但在循环中我再次添加了开始(mov eax, sarray[esi])。

修复此问题后,我还必须添加另一个循环来打印第二个数组(反转的数组)。

这里是工作代码:

INCLUDE Irvine32.inc

.data
sarray DWORD 500h, 400h, 300h, 200h, 100h
darray DWORD 5 DUP(?)

.code
main PROC

    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,[esi]       ;move 1st sarray element to eax
    mov [edi],eax       ;move 1st sarray element as last element to the darray  
    add esi, TYPE sarray
    sub edi, TYPE darray
    loop reverseLoop
    call clrscr

    mov esi, OFFSET darray
    mov ecx, LENGTHOF darray
    mov ebx, 0

printerLoop:
    mov eax,[esi]
    call WriteHex           
    call Crlf
    add esi, TYPE darray
    loop printerLoop

    call Crlf

    exit
main ENDP

END main

【讨论】:

  • 为了使它成为一个更好的答案(我会赞成),请edit 包括(在顶部)简要说明您的原始代码有什么问题以及您如何更改它. Jester 基本上已经在 cmets 中告诉过您这一点,因此您能够接受提示并将其转化为真正的代码真是太好了,但理想情况下,我们希望这些信息包含在答案本身中。
  • 已编辑。感谢您的建议
猜你喜欢
  • 2022-07-05
  • 2014-08-24
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2022-11-30
  • 2022-11-25
  • 1970-01-01
相关资源
最近更新 更多