【问题标题】:Assembly - Correcting a Source Program汇编 - 更正源程序
【发布时间】:2016-02-11 20:17:30
【问题描述】:

我被分配了这个任务:

这个程序应该在一个字节数组中搜索值 0xf2。当它找到 0xf2 时,它应该将其位置(即地址)保存到整数变量“f2Address”中。如果在数组中没有找到 0xf2 的值,它应该将 0x00 的值放入变量“f2Address”中。这个程序有一些错误。修复此程序,使其正常工作。

给出的原始代码是:

.label   TABLE1_LOC_START
TABLE1  .byte   0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0
TABLE1_ST  .word   TABLE1_LOC_START

RESET       mov.w   #0280h,SP               
            mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; stop watchdog timer

        mov     &TABLE1_ST, R10
        mov     #0xf2, R11
        mov     #0x08, R12
again       inc     R10
        cmp     0(R10), R11
        je      found
        dec     R12
        jz      again
found       mov     R10, &f2Address

endProgram  jmp     endProgram

为了解决这个问题,我将“je”更改为“jeq”,并在代码中添加了“mainLoop”。在我修改后,我有这个代码:

.label   TABLE1_LOC_START
TABLE1  .byte   0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0
TABLE1_ST  .word   TABLE1_LOC_START

mainLoop   mov    &TABLE1_ST, R10   
        mov    #0xf2, R11           
        mov    #0x08, R12           
again   inc    R10                  
        cmp    R10, R11             
        jeq    found                
        dec    R12                  
        jnz    again                 
found   mov    R10, &f2Address      

endProgram  jmp    endProgram

当我单步执行时,R12 最终会递减到零。一旦这样做,就意味着没有找到 0xf2 的值,所以它应该在“f2Address”中放置一个 0x00。但是,它没有在此处放置零,而是继续在指令中移动,而无需在任何地方更改/添加任何值。

我不太确定接下来该做什么或下一步该去哪里。它在 MSP430 上使用 CodeComposer。

【问题讨论】:

  • @PeterCordes:该程序集不适用于 x86,它适用于基于 16 位 RISC 的 TI 处理器,该处理器恰好具有寄存器 R0 到 R15。 MSP430 的许多汇编指令名称与 x86 汇编器上使用的指令名称相似,因此很容易认为这可能是 x86。
  • @MichaelPetch:谢谢。有标签吗? nvm,当我输入此评论的其余部分时,您已经重新标记了。无论如何,即使进行了编辑,我仍然没有看到关于它是如何出错的清晰描述/OP 使用调试器发现了什么。例如“但是在这条指令之后,值 x 不是我期望的”。因此,在情况有所改善之前,我将保留我的反对意见。
  • @defaultname:我已在问题中添加了您的评论,但您未能告诉我们的是您的解决方案如何没有解决问题,它做错了什么等等。您已经向我们展示了问题的解决方案,但尚未明确它是如何失败(或无法正常工作)
  • 当我单步执行时,R12 最终递减到零。一旦这样做,就意味着没有找到 0xf2 的值,所以它应该在“f2Address”中放置一个 0x00。但是,它没有在此处放置零,而是继续在指令中移动,而无需在任何地方更改/添加任何值。
  • @defaultname:正是您的问题之前缺少的那种东西。删除了我的反对票。没有人愿意为您从头开始调试您的代码,因此如果人们能够在您遇到困难的地方找到帮助,您就更有可能获得帮助。

标签: arrays assembly msp430


【解决方案1】:

想通了:

mainLoop    mov    &TABLE1_ST, R10  
        mov    #0xf2, R11       
        mov    #0x10, R12       

again   inc    R10          
        cmp    0(R10), R11      
        jeq    found                                       
        dec    R12          
        jnz    again            
        mov #0x00, &f2Address   

found   mov    R10, &f2Address  

endProgram  jmp    endProgram          

【讨论】:

  • 如果 0xF2 是第一个表条目,这将不起作用。当达到endProgram 时,f2Address 永远不会为零。
猜你喜欢
  • 2013-03-10
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2012-11-10
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多