摩托罗拉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

输出:

"星期三">

如有任何见解,不胜感激。谢谢你抽出时间。

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

要将D2与7进行比较,可以使用cmpi(compare immediate):

cmpi.b #7,d2

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

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

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

编辑(处理问题的代码,注意它没有优化):

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

最新更新