Easy68k,实现while while循环

时间:2016-04-05 04:51:44

标签: assembly 68000 easy68k

    avPlayerVideoController = [[AVPlayerViewController alloc] init];

    avPlayer = [AVPlayer playerWithURL:[NSURL URLWithString:videoURL]];

    avPlayerVideoController.view.frame = CGRectMake( imgViewVideo.frame.origin.x, imgViewVideo.frame.origin.y, imgViewVideo.frame.size.width, imgViewVideo.frame.size.height);
    avPlayerVideoController.delegate = self;
    avPlayerVideoController.showsPlaybackControls = YES;
    avPlayerVideoController.player = avPlayer;
    [avPlayerVideoController.player play];

这就是我的Easy68k代码。

int X = 0;
int Y = 1;
while(X <= 10 ){
    if(X%2 == 0)
        Y = Y * X;
    else 
        Y++;

    X++;
}
cout << "Y is: " << Y;

我不确定我的代码有什么不对,但我觉得这是循环部分开头的一个问题。我已经跟着代码,但我仍然无法弄清楚它出错的地方。当我运行它时,它会输出     Y是:10。 D1和D2也是A或10.任何帮助都表示赞赏。

3 个答案:

答案 0 :(得分:1)

在进行除法和交换之后,你仍然在d3中得到除法的结果和余数。这意味着它永远不会为零,并且比较总是假的。您需要使用and将上半部分归零或使用仅使用下半部分的form.of cmp

只需注意:当您使用2的权力时,您也可以跳过除法并直接使用and值减去1。在这种情况下,除以2的余数与and相同,值为1.

答案 1 :(得分:0)

不是使用divu更有效和更快的机制来执行与x%2相同的操作,而只是检查位0的状态。这也会产生更少的代码。这显然只适用于2的mod,任何其他值都需要另一种方法(甚至可能是可怕的分歧:))

更改现有代码以进行阅读(为简洁而修剪):

LOOP CLR.W   D3        ;Find the remainder
     MOVE.W  D1,D3
     btst    #0,d3     ; Test bit 0
     BEQ     EQUAL      ;If equal, then go to equal
     ...

执行速度会明显加快(在真实硬件上)..并非你可能会注意到:)

这是有效的,因为mod 2基本上告诉你一个数字是偶数还是奇数,这可以通过简单地查看是否设置位0来非常便宜地完成

HTH

答案 2 :(得分:0)

回答“什么是不正确的”:

LOOP CLR.W   D3        ;Find the remainder
     MOVE.W  D1,D3
     DIVU    #2,D3
68000上的

divu.wdivs.w命令从第二个参数中获取完整的32位字,并将其除以第一个参数中指定的16位字。 您的代码在分割之前无需清除高{16}的d3。 所以变化是显而易见的:

LOOP CLR.L   D3        ;Find the remainder
     ;all the same from here on