【问题标题】:problems with 8086 asm recursion8086 asm递归的问题
【发布时间】:2015-02-11 12:04:51
【问题描述】:

我的 ITEM3 程序应该做的是检查,在“鹅游戏”游戏板上,地标的最终目的地是否已被占用,如果是,则返回直到找到一个空单元格。所以我想使用递归过程。 编辑:

代码如下: 在掷出骰子(或计算单元格给予玩家的奖励)后,推动计算出的位置标记位置后调用该过程。

    ITEM3 PROC
    MOV BP, SP
    PUSHA
    MOV BX, [BP+2]    ;BX now contains the position to be checked.
    CMP BX, 0         ;if the placemarker is in the start cell,
    JE no_collision   ;there's no collision
    MOV DL, PLAYER    ;PLAYER is a variable containing 1, 2 or 3, pointing the player
;now some thoughts: if the player doesn't actually move (some "negative award")
;then there is no collision. So I check if the future position is already occupied, but
;I check if it is occupied by the same player, too. The following 6 labels are for this purpose
    CMP BL, P1_POS
    JE collisionp1
p2collision:
    CMP BL, P2_POS
    JE collisionp2
p3collision:
    CMP BL, P3_POS
    JE collisionp3
    JMP no_collision
collisionp1:
    CMP DL, 1
    JE p2collision
    JMP collision
collisionp2:
    CMP DL, 2
    JE p3collision
    JMP collision
collisionp3:
    CMP DL, 3
    JE no_collision
collision:             ;there's a collision. The placemarker goes back by 1 cell. Then the recursion start.
    DEC BL
    PUSH BX
    CALL ITEM3
    POP BX
    MOV [BP+2], BX
no_collision:
    POPA
    RET
ITEM3 ENDP

但是,当调用过程时,placemarker 没有任何反应。错误在哪里?谢谢。

Here你可以找到完整的代码。

【问题讨论】:

  • 使用调试器单步执行您的代码,看看哪里出错了。另外,注释您的代码,特别是如果您希望其他人提供帮助。 PS:尽可能避免递归。
  • @Jester 你说得对,我很着急。我在代码上添加了一些评论。我尝试调试,但是当调用该过程时,调试器没有进入该过程的代码。我会再尝试。目前我的目标是在明天早上之前让它工作,如果我不能,我会切换到迭代..但我想改变我能做的最少的行
  • SOLVED BP 寄存器已更改,但我没有看到。谢谢大家的关注。
  • @EnricoBalsamo 过程 ITEM3 和 ITEM1C 都遇到同样的问题。很高兴您找到了解决方案。也许您可以发布一个简短的答案,说明您是如何解决的。
  • @user3144770 你是对的,我一直很粗鲁。这是整个正确且有效的代码codepad.org/VbblYEka

标签: assembly recursion x86-16


【解决方案1】:

这是一个旧帖子,但我认为应该发布一个明确的答案。

问题是对ITEM3 过程的调用更改了BP registry,因此涉及BP 的以下指令没有正确执行。

解决方案是在调用过程之前PUSH BP,然后立即弹出。

    ITEM3 PROC
    MOV BP, SP
    PUSHA
    MOV BX, [BP+2]
    CMP BX, 0
    JE no_collision
    MOV DL, PLAYER
    CMP BL, P1_POS
    JE collisionp1
p2collision:
    CMP BL, P2_POS
    JE collisionp2
p3collision:
    CMP BL, P3_POS
    JE collisionp3
    JMP no_collision
collisionp1:
    CMP DL, 1
    JE p2collision
    JMP collision
collisionp2:
    CMP DL, 2
    JE p3collision
    JMP collision
collisionp3:
    CMP DL, 3
    JE no_collision
collision:
    DEC BL
    PUSH BP                 ; HERE
    PUSH BX
    CALL ITEM3
    POP BX
    POP BP                  ; AND HERE
    MOV [BP+2], BX
no_collision:
    POPA
    RET
ITEM3 ENDP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多