ARM base instruction -- mov

本文详细介绍了ARM指令集中MOV指令的使用,包括如何从寄存器、立即数或移位寄存器装载值到目的寄存器,以及如何通过MOV指令实现NOP和位移操作。还提到了R15作为目的寄存器时如何改变程序计数器或标志,以及特殊应用如子程序返回。同时,文中示例展示了如何组合MOVW和MOVT指令加载32位立即数。最后,通过代码实例解释了MOV指令在实际程序中的应用,如调用printf函数。
摘要由CSDN通过智能技术生成

/*
 * MOV : 传送
 */
    (Move)
 
    MOV{条件}{S}  <dest>, <op 1>
 
        dest = op_1
 
    MOV 从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。
    你可以指定相同的寄存器来实现 NOP 指令的效果,你还可以专门移位一个寄存器:
 
        MOV     R0, R0                  ; R0 = R0... NOP 指令
        MOV     R0, R0, LSL#3           ; R0 = R0 * 8
 
    如果 R15 是目的寄存器,将修改程序计数器或标志。这用于返回到调用代码,方法是把连接寄存器的内容传送到 R15:
 
        MOV     PC, R14                 ; 退出到调用者
        MOVS    PC, R14                 ; 退出到调用者并恢复标志位
                                        (不遵从 32-bit 体系)
        mov r1, r0            // r0 的值传送到r1
        mov pc, r14            // r14的值传送到pc, 常用于子程序返回
        mov r1, r0, lsl#3    // r0 的值左移 3 位后传送到 r1
        mov r1,#4096        // r1 = 4096
        movs r0, #0            // r0=0 N=0 Z=1 C=0,  
                            // MOVS总是会影响CPSR, 包括N,Z,C标志位,执行MOVS pc, lr时,
                            // CPSR会被SPSR覆盖(内核态,USER和SYSTEM模式下没有SPSR)
        movcss r0, r2
 
        MOVW  把 16 位立即数放到寄存器的底16位,高16位清0
        MOVT  把 16 位立即数放到寄存器的高16位,低 16位不影响  
 
        /* reverse\beginners\051-c++\01-class.cpp */
        10546:    f240 50a8     movw    r0, #1448    ; 0x5a8        /* r0 = 0x5a8 */
        1054a:    f2c0 0001     movt    r0, #1                    /* r0 = (1 << 16) | 0x05a8 = 0x105a8 */
        1054e:    f7ff ef38     blx    103c0 <printf@plt>            /* printf("%d, %d\n", v1, v2); */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值