欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【ARM】ARM汇编程序设计(二)

程序员文章站 2024-02-01 19:01:58
...

00. 目录

01. mla指令

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC0

    mov r1, #10
    mov r2, #20
    mov r3, #30

    @r1 = r1 * r2 + r3
    mla r1, r1, r2, r3

    bl printf

    
    mov r0, #0
    pop {pc}

02. umull指令

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC0

    mov r3, #3
    mov r4, #5

    umull r1, r2, r3, r4
    
    bl printf

    
    mov r0, #0
    pop {pc}

03. umlal指令

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC0

    mov r1, #1
    mov r2, #0
    mov r3, #3
    mov r4, #5

    umlal r1, r2, r3, r4
    
    bl printf

    
    mov r0, #0
    pop {pc}

04. smull指令

    .section .rodata
    .align 2
.LC0:
    .string "val = %d %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC0

    mov r1, #1
    mov r2, #0
    mov r3, #3
    mov r4, #5

    smull r1, r2, r3, r4
    
    bl printf

    
    mov r0, #0
    pop {pc}

05. smlal指令

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC0

    mov r1, #1
    mov r2, #0
    mov r3, #3
    mov r4, #5

    smlal r1, r2, r3, r4
    
    bl printf

    
    mov r0, #0
    pop {pc}

06. adc指令

程序示例:

    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC0

    mov r1, #2
    mvn r2, #0

    mov r3, #10
    mov r4, #20

	@会设置C位
    add r1, r1, r2

    adc r1, r3, r4
    bl printf

    
    mov r0, #0
    pop {pc}

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC0

    mov r3, #10
    mov r4, #20

    adc r1, r3, r4
    bl printf

    
    mov r0, #0
    pop {pc}

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC0


    mov r1, #0
    msr cpsr, r1

    mov r3, #10
    mov r4, #20

    adc r1, r3, r4
    bl printf

    
    mov r0, #0
    pop {pc}

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC0


    mov r1, #0
    msr cpsr, r1

    mov r1, #-1
    mov r2, #3
    adds r1, r1, r2

    mov r3, #10
    mov r4, #20

    adc r1, r3, r4
    bl printf

    
    mov r0, #0
    pop {pc}

07. sbc指令

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

.LC1:
    .string "cpsr = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    mrs r1, cpsr

    mvn r1, #0
    msr cpsr, r1

    
    ldr r0, =.LC1
    mrs r1, cpsr
    bl printf

    mov r3, #10
    mov r4, #20
    sbc r1, r4, r3
    ldr r0, =.LC0
    bl printf
        
    mov r0, #0
    pop {pc}

08. mrs指令

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

.LC1:
    .string "cpsr = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC1
    mrs r1, cpsr
    bl printf

    mov r3, #10
    mov r4, #20
    adc r1, r3, r4

    ldr r0, =.LC0
    bl printf

        
    mov r0, #0
    pop {pc}

09. msr指令

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

.LC1:
    .string "cpsr = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    ldr r0, =.LC1
    mrs r1, cpsr

    bic r1, r1, #(1 << 29)
    msr cpsr, r1


    mov r3, #10
    mov r4, #20
    adc r1, r3, r4

    ldr r0, =.LC0
    bl printf

        
    mov r0, #0
    pop {pc}

程序示例

    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

.LC1:
    .string "cpsr = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    mrs r1, cpsr

    mvn r1, #0
    msr cpsr, r1

    
    ldr r0, =.LC1
    mrs r1, cpsr
    bl printf


    mov r3, #10
    mov r4, #20
    adc r1, r3, r4

    ldr r0, =.LC0
    bl printf

        
    mov r0, #0
    pop {pc}

10. 综合应用一

程序示例

@r1 = 100*230-(236&(1<<7))+(157|(1<<17))-(123^456);
    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

       
    @100 * 230
    mov r3, #100
    mov r4, #230
    mul r1, r3, r4

    mov r2, #236
    and r2, r2, #(1 << 7)

    sub r1, r1, r2

    mov r2, #157
    orr r2, r2, #(1 << 17)

    add r1, r1, r2

    mov r2, #123
    mov r3, #456
    eor r2, r2, r3
    
    sub r1, r1, r2
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}

11. 综合应用二

程序示例

@ r1 = 255 把r1的第4位清0,第15位置一;
    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    mov r2, #0xff

    bic r2, r2, #(1 << 4)

    orr r1, r2, #(1 << 15)
       
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}


12. 综合应用三

程序示例

@r1 = 255 只把r1的第4位和第7位清0;
    .section .rodata
    .align 2
.LC0:
    .string "val = %d\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}

    mov r2, #0xff

    bic r1, r2, #(1 << 4 | 1 << 7)

       
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}

13. 综合应用四

程序示例

@ r1 = 0x3456 把r1的第4到第10位清0,其他位不变;

    .section .rodata
    .align 2
.LC0:
    .string "val = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}


    mov r2, #0x3400
    add r2, r2, #0x56

    bic r1, r2, #(0x7f << 4)
       
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}

14. 综合应用五

程序示例

@r1 = 0x3456 把r1的第4到第10位置1,其他位不变;
    .section .rodata
    .align 2
.LC0:
    .string "val = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}


    mov r2, #0x3400
    add r2, r2, #0x56

    orr r1, r2, #(0x7f << 4)
       
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}

15. 综合应用六

程序示例

@r1 = 0x3456 把r1的第4到第10位设成0b1001110,其他位不变;
    .section .rodata
    .align 2
.LC0:
    .string "val = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}


    mov r2, #0x3400
    add r2, r2, #0x56

    bic r1, r2, #(0x7f << 4)
    orr r1, r1, #(0b1001110 << 4)
       
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}

16. 综合应用七

程序示例

@r1 = 0x3456 把r1的第4到第10位取反,其他位不变;
    .section .rodata
    .align 2
.LC0:
    .string "val = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}


    mov r2, #0x3400
    add r2, r2, #0x56


    eor r1, r2, #(0x7f << 4)
       
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}

17. 综合应用八

@r1 = 0x3456 取出r1的第4到第10位的值;
    .section .rodata
    .align 2
.LC0:
    .string "val = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}


    mov r2, #0x3400
    add r2, r2, #0x56

    and r1, r2, #(0x7f << 4)
    mov r1, r1,  LSR #4
       
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}

18. 综合应用九

@ r1 = 0x3458把r1中最后的1清除,其他位保持不变;

    .section .rodata
    .align 2
.LC0:
    .string "val = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}


    mov r2, #0x3400
    add r2, r2, #0x58

    sub r3, r2, #1

    and r1, r2, r3

       
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}

19. 综合应用十

@r1 = 0x3458 把r1中倒数二个的1清除,其他位保持不变;
    .section .rodata
    .align 2
.LC0:
    .string "val = %p\n"

    .section .text
    .align 2
    .global main
main:
    push {lr}


    mov r2, #0x3400
    add r2, r2, #0x58

    sub r3, r2, #1

    and r1, r2, r3

    sub r2, r1, #1
    and r1, r1, r2

       
    ldr r0, =.LC0
    bl printf


    mov r0, #0
    pop {pc}

20. 附录

上一篇: 洛谷 P1008 三连击

下一篇: