Assembly 摩托罗拉68000组件比较数字

Assembly 摩托罗拉68000组件比较数字,assembly,conditional,motorola,68000,Assembly,Conditional,Motorola,68000,我正在编写的程序以一位数字后跟一个空格再后跟一个两位数字的形式进行输入。该程序将把这两个数字相加,将数字减少7秒直到小于7秒,并将该数字与一周中的某一天相关联。以下是我所拥有的: start: initIO * Initialize (required for I/O) setEVT * Error handling routines * initF * For floating point macros on

我正在编写的程序以一位数字后跟一个空格再后跟一个两位数字的形式进行输入。该程序将把这两个数字相加,将数字减少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
当我弄清楚如何进行上面的比较时,将会有更多的代码,但是为了提供正确的响应,只使用结果与星期几的值进行相同的比较

我尝试过使用各种形式的cmp(cmpa、cmpi.w/l等),但似乎找不到一种方法可以比较这两个值。在尝试比较之前,我是否需要将标记为“week”的值加载到寄存器中

输入/输出示例:

输入:

110

输出:

“星期三”


任何见解都值得赞赏。谢谢你抽出时间

您正在尝试使用不支持的寻址模式执行比较(在您的示例中,“week”操作数不是立即数,而是内存地址)

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

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

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

这是将标签的地址加载到a0中,所以我想我只需要找出正确的语法来加载该地址的值,我应该很好。@JeremyH。实际上,您不需要在运行时更改
week
,因此与其将其存储在内存中,不如将其定义为汇编器常量。(我忘记了m68k语法,但类似于
week eq 7
,所以当您编写
cmpi.w week,d2
时,它相当于编写
cmpi.w#7,d2
@JeremyH.:顺便说一句,m68k寻址模式:。绝对(和PC相对)寻址模式确实存在。也许你的汇编程序在抱怨,因为
week
标签后面跟着一个
dc.b
,但你正在加载一个单词?@PeterCordes感谢你的指导。我终于把程序启动了。还有一些优化工作要做,但这超出了本论坛的范围。我最终使用了你本周的equ,我会查看你的网站。再次感谢!@JeremyH.:嘿,不是“我的”网站,这是谷歌在
m68k寻址模式
方面的第一次成功。m68k
eq
使用了与NASM相同的语法。当我有Atari ST时,我学会的第一种汇编语言是m68k,但我已经有近20年没有使用过它了。请不要将答案编辑到问题中,将其作为答案发布。(并回滚编辑。)即使问题代码仍然存在并且与工作代码分离?可以。是的,在问题中回答问题会打破问答形式,将自己的答案放在一个特殊的位置上,投票无法将最佳答案排在首位。(对于调试帮助问题几乎不重要,因为不幸的是它们很少有未来价值;当其他人也不知道自己的问题是什么时,他们很难搜索并找到正确的问题。)无论如何,谢谢你整理你的问题,欢迎来到Stack Overflow。
BEQ end
是一个有条件的分支,对吗?当然它应该是一个无条件的跳转,而不是以
lineout
留下的标志为条件。你已经知道这不是优化的,但最大的一个跳转是你可以做一个绑定s-check,然后从字符串指针表中进行表查找。因此,在内存中使用的不是
$1
$2
等,而是
dc.w$sunr,$monr,
(或任何将另一个标签的地址作为数据的正确语法),因此您可以将索引加载到A2或其他内容中,然后将A2排成一行。此外,您确实不需要将
$1
存储在
dc.w
中。1-7个常量也可以是
eq
常量。此外,我认为您忘记了
wkmsg
之后的
,0
,但如果字符数是奇数,则使用
dc.w
通过将一个零填充到一个整数来避免你自己。
lea week,a0
...
cmp.b (a0),d2
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