我正在编写的程序以单个数字的形式输入,后跟一个空格,后跟两位数字。程序将获取两个数字并将它们加在一起,将数字减少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
输出:
“星期三”
任何见解都表示赞赏。谢谢你的时间。
答案 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