midplum 发表于 2013-5-19 20:34:16

请教这段代码的含义

                   MOV   A,@R0
                   JB    ACC.7,multiple
                   CJNEA,#0CH,Jump1000
Jump1000:          JC    multiple
                   MOV   R2,#75H
                   MOV   R3,#30H
                   LJMPGetRusl
;===========================================
multiple:          MOV   R6,#00H
                   MOV   R7,#0AH
                   LCALL Multi_Routine           //@R0@R0+1 *        R6R7
                   MOV   R6,#00H
                   MOV   R7,#01H
                   LCALL Div_routine          //@R0@R0+1 /R6R7
GetRusl:         MOV   A,R2
                   MOV   @R0,A
                   INC   R0
                   MOV   A,R3
                   MOV   @R0,A
                   RET
------------------------------------------------------------------------------------------------------------------
      请教各位高手:这段条件判断有何作用?JB    ACC.7,multiple是判断@R0@R0+1是否是负数。就是不明白CJNEA,#0CH,Jump1000的作用。
             MOV   A,@R0
                   JB    ACC.7,multiple
                   CJNEA,#0CH,Jump1000
Jump1000:   JC    multiple
               

zjk 发表于 2013-5-19 20:36:18

晕,汇编啊,爱莫能助哈

jlhgold 发表于 2013-5-19 21:13:13

就是A不等于#0CH的时候跳转到Jump1000呗 还能有啥意思。。。

sunliezhi 发表于 2013-5-19 21:30:56

对C的影响:按无符号数减法。前数减后数,有借位C = 1,否则C = 0。
下面就有 JC   multiple   来判断被减数与减数的大小以决定去哪个分支

wjwjwjwj98 发表于 2013-5-19 22:18:09

                        CJNEA,#0CH,Jump1000
Jump1000:          JC    multiple
                        MOV   R2,#75H
好像这程序不完整,就是这句没意义啊CJNEA,#0CH,Jump1000,不管A等不等于#0CH,都要执行下一句Jump1000:

4555 发表于 2013-5-19 23:01:24

JB    ACC.7,multiple是判断@R0是否是负数。
如果是负数,跳到multiple,
否则是非负数,继续执行
【CJNEA,#0CH,Jump1000】:
【JC    multiple】:
比较该数据(@R0),是否小于12(#0CH)
如果小于12,就执行multiple
否则,执行:
MOV   R2,#75H
                   MOV   R3,#30H
                   LJMPGetRusl
///////////////////////////////////////////////////////
关键是要把【CJNEA,#0CH,Jump1000】:
【JC    multiple】:
这两条指令,组合起来判断

sunliezhi 发表于 2013-5-21 13:32:52

wjwjwjwj98 发表于 2013-5-19 22:18 static/image/common/back.gif
CJNEA,#0CH,Jump1000
Jump1000:          JC    multiple
                     ...

对啊,这里逻辑有问题!

yangbing2020 发表于 2013-5-22 22:07:38

哎呦,汇编啊!

xou822 发表于 2013-5-23 12:53:54

同意楼上的

楼主的程序可以简化为

               MOV   A,@R0    //把R0所指的地址的值赋给A
                  JB    ACC.7,multiple//如果A的最高位为1(代表负数)则跳转到multiple
//                   CJNEA,#0CH,Jump1000   如果A不等于0xC,跳转到Jump1000(也就是下一行),否则执行下一行
Jump1000:          JC    multiple      //如果CY等于一,就跳转到multiple
                  MOV   R2,#75H      //R2载入立即数75   
                  MOV   R3,#30H       //R3载入立即数30
                  LJMPGetRusl         //跳转到GetRusl
;===========================================
multiple:          MOV   R6,#00H      //R6清零
                  MOV   R7,#0AH         //R7载入立即数A(00001010)
                  LCALL Multi_Routine         //@R0@R0+1 *      R6R7
                  MOV   R6,#00H
                  MOV   R7,#01H
                  LCALL Div_routine          //@R0@R0+1 /R6R7
GetRusl:         MOV   A,R2          //R2赋值给A
                  MOV   @R0,A         //A的值载入到R0所指地址中(数据存储器中)
                  INC   R0                  //R0(地址)自增一
                  MOV   A,R3            //R3赋值给A
                  MOV   @R0,A         //A的值载入到R0所指地址中(数据存储器中)
                  RET                         //返回断点,继续执行LJMP GetRusl下面的语句

midplum 发表于 2013-6-16 23:26:19

非常多谢各位的解析。
这段代码的作用是@R0@R0+1是负数或者@R0<#0cH则(@R0@R0+1)*10.我不明白的是@R0<#0cH这个条件比较是一个上限比较,但是@R0@R0+1是作为一个整形数,为什么@R0+1不参与比较?
页: [1]
查看完整版本: 请教这段代码的含义