【问题标题】:Understanding the "S[cc]" instructions of 68000 assembly理解68000汇编的“S[cc]”指令
【发布时间】:2014-07-30 10:56:09
【问题描述】:

我正在尝试理解 68000 程序集中的“S[cc]”指令集。

指令的格式是这样的:

S[cc] reg

[cc] 是条件代码(例如,SEQ 表示“如果等于则设置”)。如果[cc] 指定的条件为真,则寄存器设置为所有1s。否则,寄存器设置为所有0s。

有一件事我不明白:S[cc] 操作在哪里检查条件是否为真?它会检查标志吗?

如果是这样,比我想注册D0 来保存表达式D0 = D1 的结果,这就是我需要做的:

CMP D0,D1 ; this sets the flags according to the result
SEQ D0 ; sets D0 to true if the flags indicate the condition is true. else, sets it to false.

这是正确的吗?还是我没有正确理解这个操作?

【问题讨论】:

    标签: assembly 68000


    【解决方案1】:

    是的,它会检查标志,这在查看助记符时应该很明显:

    SCC set on carry clear (!C)
    SCS set on carry set (C)
    SEQ set on equal (Z)
    SGE set on greater than or equal (N.V + !N.!V)
    SGT set on greater than (N.V.!Z + !N.!V.!Z)
    SHI set on higher than (!C.!Z)
    SLE set on less than or equal (Z + N.!V + !N.V)
    SLS set on lower than or same (C + Z)
    SLT set on less than (N.!V + !N.V)
    SMI set on minus (i.e., negative) (N)
    SNE set on not equal (!Z)
    SPL set on plus (i.e., positive) (!N)
    SVC set on overflow clear (!V)
    SVS set on overflow set (V)
    SF  set on false (i.e., set never) (0)
    ST  set on true (i.e., set always) (1)
    

    取自http://de.scribd.com/doc/418461/Easy-Motorola-68k-Reference 第 51 页。我不知道关于 68k ASM 的第一件事。 ;-)

    【讨论】:

    • 您可能会说:当相应的 B[cc] 指令执行跳转时,S[cc] 将目标字节设置为 0xFF。如果 B[cc] 指令不执行跳转,它会将字节设置为 0x00。
    【解决方案2】:

    我还想指出 s[cc] 只影响最低有效字节(例如,如果你这样做 st d0d0 将是 $xxxxxxFFxx 意味着这将是过去在寄存器上的任何内容)。此外,在条件为真的情况下,字节将设置为$FF 而不是1。在错误的情况下,它将被清除。

    【讨论】:

    • 真的没有签名扩展所以当真$000000FF
    【解决方案3】:

    看看摩托罗拉的68K Programmer's Reference Manual (1992)

    3-23给你答案: 条件代码检查状态寄存器中的位。状态寄存器不仅通过比较操作设置。有关它们如何影响状态寄存器的详细信息,请参阅其他助记符。

    【讨论】:

      【解决方案4】:

      S<cc> 会检查条件标志。您可能会喜欢这个简单的指南,了解如何使用CMP 指令设置您喜欢的标志:

              CMP     src, dest
      
      dest <  src     LT      CS      src >= dest     ; CS = LO
      dest <= src     LE      LS      src >= dest
      dest == src     EQ      EQ      src == dest
      dest != src     NE      NE      src != dest
      dest >  src     GT      HI      src <= dest
      dest >= src     GE      CC      src <= dest     ; CC = HE
            signed ---^       ^--- unsigned
      

      例如,如果要检查无符号值src 是否大于或等于dest,请使用CMP src,dest,然后使用SCS。如果值已签名,但您想要相同的测试(src &gt;= dest),请使用SLT

      您可以使用TST 指令将值与零进行比较,尽管在许多情况下这是自动完成的(例如MOVE 也会同时进行测试)

              TST     dest
      
      dest == 0       EQ
      dest != 0       NE
      dest <  0       MI
      dest >= 0       PL
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        相关资源
        最近更新 更多