国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > ASM > 正文

ARM:偽指令、偽操作、C和匯編混合操作、匯編控制LED

2019-11-08 02:12:56
字體:
來源:轉載
供稿:網友
1、偽指令    指令本身不被ARM core所識別    但是匯編器可以把偽指令翻譯成一條或多條ARM core認識的指令1.1 【ldr】---> 重點掌握    作用1:'將立即數存儲到特定寄存器中,(匯編代碼中使用=的)                mov r0, #0x1ff                可以使用                ldr r0, =0x1ff                _start:                    ldr r0, =0x1ff                    ldr r1, =lable  // 將lable對應的地址加載到r1                    b .                    .end                arm-co...-as pesdo.s -o pesdo.o                arm-co...-objdump -S pwsdo.o > 1.asm    作用2:'將lable標簽對應內存中的數據加載到寄存器(匯編代碼中同時沒有使用=和[ ]的)                ldr r2, lable1.2 【adr】    作用:'小范圍地址加載指令   ADR{cond} register, exPR    adr 可以找到標號對應代碼在內存中的位置    adr r3, delay  @// sub r3, pc, #4    delay:            mov r5, r6    1.3 【nop】    作用:'空操作,用于延時    一般會被編譯器翻譯為 mov r0, r02、偽操作    '以 . 開頭的都是偽操作    .arm  /  .code 32   / .thumb  / .code 16   // arm或thumb匯編指令    .equ// 常量定義偽操作            .equ NUM, #0x20            mov r0, NUM    .global  / .globl  // 將一個標號聲明為聲明全局的常量偽操作    .extern  // 聲明外部常量偽操作    .hWord / .short // 半字定義偽操作    .word / .int / .long // 字定義偽操作    .byte // 字節定義偽操作    .string "abcde" / .ascii "abcde" / .asciz "abcde" // 字符串定義偽操作    .space 1024  / .skip 1024 // 固定填充字節內存單元定義偽操作3、使用匯編控制LED    電路原理圖:        控制LED1就是控制GPIOC12    控制GPIOC12: 3 個特殊功能寄存器        GPIOC_OUT          0xc001c000        GPIOC_OUTENB    0xc001c004        GPIOC_ALTFN0      0xc001c020    使用匯編代碼編寫:led.s
/** 代碼演示  - les.s **/.text.global _start.code 32@ 定義三個控制led燈的GPIO寄存器.equ GPIOC_OUT,         0xc001c000.equ GPIOC_OUTENB,      0xc001c004.equ GPIOC_ALTFN0,      0xc001c020_start:        @ 功能選擇 FUNCTION1        ldr r0, =GPIOC_ALTFN0    @ r0=0xc001c020        ldr r1, [r0]             @ r0放到r1作為緩存        mov r2, #0x03        bic r1, r1, r2, lsl #24  @ clear r1 [25:24]        mov r2, #1        orr r1, r1, r2, lsl #24  @ set r1 [24]        str r1, [r0]             @ 寫回r0寄存器GPIOC_ALFN0                @ 配置為輸出功能        ldr r0, =GPIOC_OUTENB    @ r0=0xc001c004        ldr r1, [r0]        mov r2, #1        orr r1, r1, r2, lsl #12  @ set r1 [12]        str r1, [r0]             @ 寫回r0寄存器GPIOC_OUTENB                mov r2, #1loop:        @ 亮燈        ldr r0, =GPIOC_OUT       @ r0=0xc001c000        ldr r1, [r0]        bic r1, r1, r2, lsl #12  @ clear r1 [12]        str r1, [r0]        bl delay                 @ 調用函數delay        @ 滅燈        ldr r0, =GPIOC_OUT       @ r0=0xc001c000        ldr r1, [r0]        orr r1, r1, r2, lsl #12  @ set r1 [12]        str r1, [r0]        bl delay        b loop                   @ b跳轉loop循環 - led間歇閃爍delay:        mov r0, #0x8000000       @ 設置延時,值較C語言大,因速度快delay_loop:        sub r0, r0, #1                   @ r0=r0-1        cmp r0, #0                               @ 比較 r0 與 0        bne delay_loop                   @ 不相等,b跳轉自身循環繼續--        mov pc, lr                               @ bx lr 壓棧.end/** ------------------------------------------------------- **/4、C和匯編的混合調用    ATPCS  // ARM體系結構與編程.pdf  --->P241.        1)使用的滿減棧 FD        2)函數參數的傳遞,前4個參數使用 r0 r1 r2 r3剩余參數使用棧傳遞         3)函數返回時,返回值使用r04.1 匯編中如何調用C函數    xxx.s - 匯編        .extern func   @// 使用extern聲明func標號為外部函數        mov r0, #5     @// r0 里面最終會保存函數的返回值        mov r1, #10        bl func           @// bl 調用func函數,傳遞參數5和10    yyy.c - C程序        int func (int a, int b) {            return a + b;        }4.2 C程序中如何調用匯編函數    yyy.c - C程序        extern int func (int, int);         func (10, 20);    xxx.s - 匯編        .global func       @// 必要條件        func:            add r0, r0, r1            mov pc, lr4.3 C程序中嵌套匯編語法練習:    shell框架程序。    使用匯編實現led.c里面的函數 - led.s。' vi Makefile  新增arm的as編譯匯編文件變量        AS=arm-cortex_a9-linux-gnueabi-as        %.o:%.s                $(AS) $< -o $@
/** 代碼演示 **/.text.global led_init.global led_on.global led_off.code 32.extern uart_puts     @// 打印字符換來做調試使用.equ GPIOC_OUT,     0xc001c000.equ GPIOC_OUTENB,  0xc001c004.equ GPIOC_ALTFN0,  0xc001c020led_init:    stmfd sp!, {lr}        @// 把lr壓棧,保證lr是原來的值    ldr r0, =str1          @// 將str1的首地址放到r0里面    bl uart_puts          @// 調用uart_puts函數來打印顯示    @ 功能選擇 FUNCITON1    ldr r0, =GPIOC_ALTFN0       @ r0=0xc001c020    ldr r1, [r0]    mov r2, #0x03    bic r1, r1, r2, lsl #24     @ clear r1 [25:24]    mov r2, #1    orr r1, r1, r2, lsl #24     @ set r1 [24]    str r1, [r0]    @ 配置為輸出功能    ldr r0, =GPIOC_OUTENB       @ r0=0xc001c004    ldr r1, [r0]    mov r2, #1    orr r1, r1, r2, lsl #12     @ set r1 [12]    str r1, [r0]    mov pc, lr                   @ 壓棧,相當于函數返回return                  @// ldmfd sp!, {lr} 打印調試信息,使用此句彈棧led_on:    mov r2, #1                  @ 把1放在r2寄存器緩沖區    ldr r0, =GPIOC_OUT          @ r0=0xc001c000    ldr r1, [r0]    bic r1, r1, r2, lsl #12     @ clear r1 [12] - 低電平 - 亮    str r1, [r0]    mov pc, lrled_off:    mov r2, #1    ldr r0, =GPIOC_OUT    ldr r1, [r0]    orr r1, r1, r2, lsl #12     @ set r1 [12] - 高電平 - 亮    str r1, [r0]    mov pc, lrstr1:    .string "/nled_init/0".end/** ------------------------------------------------------- **/練習二:    使用匯編指令將strcmp.c替換為strcmp.s的匯編文件。
/** 代碼演示 - strcmp.s **/.text.code 32.global my_strcmpmy_strcmp:cmp_loop:    ldrb r2, [r0], #1        @ // 每次取1個字符出來放到r2寄存器    ldrb r3, [r1], #1        @ // 每次取1個字符出來放到r3寄存器    cmp r2, #0              @ // 判斷r2是否到末尾    beq cmp_end          @ // 如果r2==0到末尾,就跳轉到cmp_end    cmp r2, r3                @ //     beq cmp_loopcmp_end:    sub r0, r2, r3    mov pc, lr                      @ // <==> bx lr.end/** ------------------------------------------------------- **/<tips>$:' cd 01/$:'ctags -R *$:' vi main.c   // 打開最開始的一個文件' 光標移動到函數或者變量名字上'Ctrl + ]         跳轉到定義/實現位置'Ctrl + t         返回上次跳轉之前的位置
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 汾西县| 新宾| 无极县| 苍溪县| 灵台县| 宁明县| 阿克陶县| 滕州市| 涟水县| 河源市| 沾益县| 吉木萨尔县| 平邑县| 个旧市| 丹阳市| 克什克腾旗| 遂昌县| 凤山市| 原平市| 五寨县| 南京市| 阿坝| 汉寿县| 巴林右旗| 瑞丽市| 洪洞县| 丹凤县| 丰台区| 玉田县| 西乌| 淮阳县| 嘉祥县| 永修县| 乌兰察布市| 安庆市| 共和县| 南宫市| 隆子县| 精河县| 宜兰市| 通州市|