2017-10-18 134 views
0

我正在编写的程序以单个数字编号的形式输入,后跟一个空格,后跟一个两位数字。该计划将采用这两个数字并将它们加在一起,将数字减少7s,直到少于7,并将该数字与一周中的某一天相关联。这里是我有:摩托罗拉68000组件比较号

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

实例:

输入:

输出:

“星期三”

任何洞察力是赞赏。谢谢你的时间。

+0

请不要编辑问题的答案;发布它作为答案。 (并回滚您的编辑。) –

+0

即使问题代码仍然存在并与工作代码分开?可以做。 –

+0

是的,回答问题中的问题会打败Q&A格式,并将您自己的答案放在一个特殊的地方,让投票无法提出最佳答案。 (对调试帮助问题很重要,因为他们很少有很多未来价值;当他们不知道自己的问题时,很难找到正确的问题)。无论如何,感谢您整理您的问题,并欢迎来到Stack Overflow。 –

回答

0

您试图执行与不支持的寻址模式的比较(在您的示例中,“周”操作数不是立即值,而是存储器地址)。

要使用7比较D2可以使用CMPI(比较立即数):

cmpi.b #7,d2 

如果你需要的操作数是一个变量,必须将它加载到寄存器中第一:

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

还要确保操作数大小在CMP指令数据的大小相匹配

+0

这是加载标签的地址到a0,所以我想我只需要找出正确的语法来加载在该地址的值,而我应该是好的。 –

+0

@JeremyH。实际上你并不需要'week'在运行时更改,所以不要将其存储在内存中,而要将其定义为汇编常量。 (我忘记了m68k的语法,但是像'week equ 7',所以当你写'cmpi.w week,d2'时,这相当于写'cmpi.w#7,d2'。 –

+0

@JeremyH .:和BTW,m68k寻址模式:http://moss.csc.ncsu.edu/~mueller/codeopt/codeopt00/notes/addmode.html绝对(和PC相对)寻址模式确实存在。也许你的汇编程序抱怨是因为'周“标签后面跟着一个'dc.b',但是你正在做一个字加载? –

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 
+0

'BEQ end'是一个条件分支,对吧?当然,它应该是一个无条件的跳转,而不是以'lineout'留下的标志为条件。 –

+0

你已经知道这并没有被优化,但是最大的一个是我可以做一个边界检查,然后从一个指向字符串的表中查找表。因此,在内存中不要使用“$ 1”,“$ 2”等,你可以使用'dc.w $ sunr,$ monr,...'(或者将另一个标签的地址作为数据的正确语法),所以你做一个索引加载到A2或其他东西,然后'输出A2“。 –

+0

另外,你真的不需要'$ 1'来存储在'dc.w'中。 1-7个常量也可以是“常量”常量。另外,我认为你在'wkmsg'之后忘记了',0',但是如果字符数是奇数,那么使用'dc.w'通过填充零来填充整个单词来保存你自己。 –