【问题标题】:How to delete element of an array in 68k assembly如何在 68k 程序集中删除数组的元素
【发布时间】:2017-11-20 20:44:57
【问题描述】:

我有一个结构数组,我需要在给定位置删除一个元素。这是我的结构的偏移量。

MOVIE       equ  62
title       equ  0
year        equ  52
time        equ  54
rating      equ  56

假设我有一个包含 12 个元素的数组,我将如何删除位置 5 的元素?

【问题讨论】:

  • 通过将其上方的所有内容向下复制一个插槽。
  • 或者,如果您不关心顺序,只需复制最后一个元素即可。
  • 对于copy-everything-down方法,你现在和memmove有同样的问题,所以使用优化的memmove实现。或者使用一个间接级别,让您只需从指针数组中删除。
  • @500-InternalServerError 谢谢,有帮助!
  • rating 是六个字节,还是我误解了第一行?

标签: assembly motorola 68000


【解决方案1】:

第一件事是你不会有一个“结构数组”。 理想的形式是有一个指向结构的指针数组,每个指针都指向它自己的结构。

         MOVEQ   #5,D0       ;element you want to delete
         BSR     DEL_MOVE
         SIMHALT

DEL_MOVE
         LSL.W   #2,D0        ; long words
         LEA     MOVIES,A0    ; array start
         LEA     0(A0,D0),A2  ; element in array (starts at 0)
         LEA     11*4(A0),A1  ; end of array -1
DEL      MOVE.L  4(A2),(A2)+  ; move down
         CMP.L   A2,A1        ; at end yet?
         BLT.S   DEL          ; branch if not
         MOVE.L  #0,(A2)+     ; last element is null
         RTS


MOVIES   DC.L    MOVIE1, MOVIE2, MOVIE3 ...
MOVIE1   DS.B    62
MOVIE2   DS.B    62
         ...

【讨论】:

  • 您当前的代码将在新的顶部元素中移动垃圾!除非4(A2) 处的长字被定义为包含合适的指针值(null 或其他)。
  • 抱歉,这个修复在 12 个长字数组的 后面 写入了一个空值!你写的MOVE 应该变成:MOVE.L #0,-4(A2)。无论从 LEA 12*4(A0),A1LEA 11*4(A0),A1 的更改如何,这都解决了这个问题,这并没有真正做任何有用的事情!
  • 如果是要删除的最后一个元素,则存在问题。 “下移”操作(在这种情况下是多余的)是无条件完成的,并且 null 写在数组后面。
  • 最简单甚至最短的解决方案是保留您的版本 1 代码,但使用终止空指针定义数组。 MOVIES DC.L MOVIE1, MOVIE2, MOVIE3, ... ,MOVIE12, 0.
  • 另一个陷阱:由于寄存器D0 已被初始化并作为 操作,因此LEA 0(A0,D0),A2 指令不应变为LEA 0(A0,D0.W),A2。我不知道你的汇编程序是否会默认使用.W
猜你喜欢
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 2016-06-21
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多