我想了解“S [CC]”以68000汇编指令集。
该指令的格式是这样的:
S[cc] reg
[cc]
是一个条件码(例如, SEQ
意味着“如果设定的equals”)。 如果指定的条件[cc]
是真实的,寄存器被设置为全1
秒。 否则,寄存器设置为全0
秒。
有一件事我不明白:哪里的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.
这个对吗? 或者我不能正确理解这个操作?
是的,它会检查标志,看助记符时就很明显:
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。 ;-)
看看摩托罗拉的68K程序员参考手册 (1992年)
表3-23
给出你答案:条件码检查在状态寄存器中的位。 状态寄存器由比较操作设置不但。 查看它们如何影响状态寄存器中的其他助记符细节。
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 >= dest
),使用SLT
您可以使用TST
指令用于比较的值为零,尽管在许多情况下,这是自动完成的(如MOVE
也将在同一时间进行测试)
TST dest
dest == 0 EQ
dest != 0 NE
dest < 0 MI
dest >= 0 PL
我也想指出的是, s[cc]
仅影响至少显著字节(例如,如果你这样做st d0
, d0
将是$xxxxxxFF
, xx
的意义,这将是任何使用上的寄存器)。 此外在这里的条件为真情况下,字节将被设置为$FF
,而不是1
。 在错误的情况下,它会被清除。