我正在编写的程序以个位数后跟空格和两位数的形式输入。该程序将把这两个数字相加,将数字减少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