摩托罗拉68000组装比较数字

时间:2017-10-18 19:39:11

标签: assembly conditional motorola 68000

我正在编写的程序以单个数字的形式输入,后跟一个空格,后跟两位数字。程序将获取两个数字并将它们加在一起,将数字减少7秒直到少于7,并将该数字与一周中的某一天相关联。这就是我所拥有的:

start:  initIO                  * Initialize (required for I/O)
    setEVT          * Error handling routines
*   initF           * For floating point macros only       

    linein  buffer          *reads in values
    cvta2   buffer,#1       *provided macro to convert ascii to num, read first digit only
    move.b  D0,D1           *Store value in D1
    cvta2   buffer+2,#2     *read the next two digits after space
    move.b  D0,D2           *store
    add.b   D1,D2           *add them together (I can probably use just one register here)

这是麻烦:

for:    cmp.w   week, D2 *<<<<< This is saying invalid syntax, I want to see if the number provided is greater than 7, if not branch out to the next section

/麻烦

    ble done
    subq.w  #7,D2        *If num>7, sub 7

done:   

    lineout dmsg

        break                   * Terminate execution
*
*----------------------------------------------------------------------
*       Storage declarations

buffer: dc.b    80
dmsg:   dc.b    'Done',0
week:   dc.b    $7    *If combined value is greater than this, sub 7
*These are the values to check against to get correct reply
sun:    dc.b    $1
mon:    dc.b    $2
tues:   dc.b    $3
weds:   dc.b    $4
thurs:  dc.b    $5
fri:    dc.b    $6
sat:    dc.b    $7
*These are the responses for the output
sunr:   dc.b    'Sunday',0
monr:   dc.b    'Monday',0
tuesr:  dc.b    'Tueday',0
wedsr:  dc.b    'Wednesday',0
thursr: dc.b    'Thursday',0
frir:   dc.b    'Friday',0
satr:   dc.b    'Saturday',0

        end

当我弄清楚如何进行上面的比较时会有更多的代码,但是为了提供正确的响应,它只是将结果与星期几的值相对应。

我尝试过使用各种形式的cmp(cmpa,cmpi.w / l等),但我似乎无法找到一种允许我比较两个值的方法。在尝试比较它或类似的东西之前,我是否必须将标记为“周”的值加载到寄存器中?

I / O示例:

输入:

  

1 10

输出:

  

“星期三”

任何见解都表示赞赏。谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

您正在尝试与不支持的寻址模式进行比较(在您的示例中,'周'操作数不是立即值,而是内存地址。)

要将D2与7进行比较,您可以使用cmpi(立即比较):

cmpi.b #7,d2

如果您需要将操作数作为变量,则必须先将其加载到寄存器中:

lea week,a0
...
cmp.b (a0),d2

还要确保cmp指令中的操作数大小与数据大小匹配

答案 1 :(得分:0)

编辑(有关问题的工作代码,但未对其进行优化):

start:  initIO                  * Initialize (required for I/O)
    setEVT          * Error handling routines
*   initF           * For floating point macros only    

    linein  buffer
    cvta2   buffer,#1   
    move.l  D0,D1
    cvta2   buffer+2,#2
    move.l  D0,D2
    add.l   D1,D2    

    divu.w  #$0007,D2   

    lsr.l   #$08,D2 *Shift remainder
    lsr.l   #$08,D2    

    move.w  sun,A2
    cmp.w   A2,D2
    BNE monday
    lineout sunr
    BEQ end

monday: 
    move.w  mon,A2
    cmp.w   A2,D2
    BNE tuesda
    lineout monr
    BEQ end    

tuesda: 
    move.w  tues,A2
    cmp.w   A2,D2
    BNE wednes
    lineout tuesr
    BEQ end    

wednes: 
    move.w  weds,A2
    cmp.w   A2,D2
    BNE thursd
    lineout wedsr
    BEQ end    

thursd: 
    move.w  thurs,A2
    cmp.w   A2,D2
    BNE friday
    lineout thursr
    BEQ end    

friday: 
    move.w  fri,A2
    cmp.w   A2,D2
    BNE saturd
    lineout frir
    BEQ end    

saturd: 
    lineout satr
    BEQ end    

end:    
        break                   * Terminate execution
*
*----------------------------------------------------------------------
*       Storage declarations

buffer: dc.b    80
wkmsg:  dc.w    'The day of the week is '
week:   equ $7
sun:    dc.w    $1
mon:    dc.w    $2
tues:   dc.w    $3
weds:   dc.w    $4
thurs:  dc.w    $5
fri:    dc.w    $6
sat:    dc.w    $7
sunr:   dc.w    'Sunday',0
monr:   dc.w    'Monday',0
tuesr:  dc.w    'Tueday',0
wedsr:  dc.w    'Wednesday',0
thursr: dc.w    'Thursday',0
frir:   dc.w    'Friday',0
satr:   dc.w    'Saturday',0

        end