ARM base instruction -- cmn

/*
 * CMN : 比较取负的值
 */
 
    (Compare Negative)
 
    CMN{条件}{P}  <op 1>, <op 2>
 
        status = op_1 - (- op_2)
 
    CMN 同于 CMP,但它允许你与小负值(操作数 2 的取负的值)进行比较,
    比如难于用其他方法实现的用于结束列表的 -1。这样与 -1 比较将使用:
 
    CMN     R0, #1                  ; 把 R0 与 -1 进行比较
    cmn     r1, r0            // r1 与 r0 的值相加,并根据结果设置 cpsr 的标志位
    cmn     r1, #100        // r1 与 100 相加, 并根据结果设置 cpsr 的标志位

  40203c:    97ffff35     bl    401d10 <getopt_long@plt>
  402040:    3100041f     cmn    w0, #0x1*/      // adds w0, 判断 w0 是否为 -1
    while ((c = getopt_long(argc, argv, "aAcC:GhH:nN:pglsStTuUVZ", options, NULL)) != -1)

  /*402044:    540002c0     b.eq    40209c <ferror@plt+0x1bc>  // b.none    // 等于-1, 跳转。说明无参数。
  402048:    51010400     sub    w0, w0, #0x41   // w0=w0-0x41, 转换成字符
  40204c:    7100d01f     cmp    w0, #0x34       // w0 <= 0x34(52), 大小写字母共52个
  402050:    54000089     b.ls    402060 <ferror@plt+0x180>*/ // b.plast   (w0<=0x34)
        switch (c) {
            default:

  /*402054:    fd242be8     str    d8, [sp, #18512]
  402058:    fd242fe9     str    d9, [sp, #18520]
  40205c:    940003dd     bl    402fd0 <ferror@plt+0x10f0>*/    // exit(1)
                usage();
    
  /*402060:    78605b00     ldrh    w0, [x24, w0, uxtw #1]      // w0=[x24+w0<<1]=[0x419a10+0x20<<1]=[0x419a10+0x40]=[0x419a50]=0x8b
  402064:    10000061     adr    x1, 402070 <ferror@plt+0x190>
  402068:    8b20a820     add    x0, x1, w0, sxth #2             // x0=0x402070+w0<<2=0x402070+0x8b<<2=0x402070+0x22c=40229C
  40206c:    d61f0000     br    x0 */                           // x0

            case 'p':
  /*402070:    52800020     mov    w0, #0x1                       // #1
  402074:    b90046e0     str    w0, [x23, #68] */       // [0x43c870+68]=‭[0x43C8B4‬]=1
                pids = 1;

            case 'c':
  /*402078:    9104e3e3     add    x3, sp, #0x138          // x3=options
  40207c:    aa1603e2     mov    x2, x22                 // "aAcC:GhH:nN:pglsStTuUVZ"
  402080:    aa1403e1     mov    x1, x20                 // x1=argv
  402084:    2a1303e0     mov    w0, w19                 // x0=argc
  402088:    d2800004     mov    x4, #0x0                       // #0
  40208c:    b9004abf     str    wzr, [x21, #72]*/
                compact = 0;

  /*402090:    97ffff20     bl    401d10 <getopt_long@plt>
  402094:    3100041f     cmn    w0, #0x1                // 如果w0=-1,则顺序执行,即运行到 40209c
  402098:    54fffd81     b.ne    402048 <ferror@plt+0x168>*/  // b.any   w0 不等于 -1,jump 402048
                break;

    // 无参数跳转
  /*40209c:    d00001d6     adrp    x22, 43c000 <memcpy@GLIBC_2.17>
  4020a0:    51000677     sub    w23, w19, #0x1          // w23=argc-1
  4020a4:    b9484ac0     ldr    w0, [x22, #2120]        // w0=[0x‭43C848‬]=optind

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值