我正在编写的程序以一个单数数字、一个空格和一个两位数字的形式输入。该程序将两个数字相加在一起,将数量减少7s直到小于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/trouble
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等),但我似乎找不到一种方法可以比较这两个值。在尝试比较它或类似的东西之前,我是否必须将标记为"week“的值加载到寄存器中?
I/O的例子:
输入:
1 10
输出:
“星期三”
任何洞察力都是值得赞赏的。耽误您时间,实在对不起。
发布于 2017-10-19 08:58:13
您正在尝试与不支持的寻址模式进行比较(在您的示例中,“week”操作数不是即时值,而是内存地址)。
要将D2与7进行比较,可以使用cmpi (比较立即):
cmpi.b #7,d2如果需要操作数作为变量,则必须先将其加载到寄存器中:
lea week,a0
...
cmp.b (a0),d2还要确保cmp指令中的操作数大小与数据大小相匹配。
发布于 2017-10-19 23:25:50
编辑(未优化问题的工作代码):
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
endhttps://stackoverflow.com/questions/46817967
复制相似问题