Fork me on GitHub

树莓派&自动运维

基础安装&配置

树莓派安装openEuler

博客链接

树莓派安装openssl

娄老师博客

修改环境变量

在/etc/profile中加入

export PATH="/root/dopenssl/bin/:$PATH"
export LD_LIBRARY_PATH="/root/dopenssl/lib:$LD_LIBRARY_PATH"

安装后运行截图

img

img

img

img

img

3-2汇编语言练习:查找最大数

.section .data
.align 3
my_data:
        .quad  1
        .quad  2
        .quad  5
        .quad  8
        .quad  10
        .quad  12

my_data_count:
        .quad  6

.align  3
print_data:
        .string "big data: %d\n"

.section .text
.globl main
main:
        stp     x29, x30, [sp, -16]!

        ldr x0, =my_data
        ldr x1, my_data_count

        add x4, x0, #40

        mov x3, xzr
1:
        ldr x2, [x0], #8
        cmp x2, x3
        csel x3, x2, x3, hi

        cmp x0, x4
        b.ls 1b

        ldr x0, =print_data
        //adrp x0, print_data
        //add x0, x0, :lo12:print_data
        mov x1, x3

        bl printf

        ldp  x29, x30, [sp], 16
        ret

img

3-3:汇编语言练习——通过 C 语言调用汇编函数

main.c

#include <stdio.h>
  
extern int compare_data(int a, int b);

int main()
{
        int val;

        val = compare_data(5, 6);

        printf("big data: %d\n", val);
}

compare.S

.section .text
.globl compare_data
compare_data:
        cmp x0, x1
        csel x0, x0, x1, hi
        ret

img

3-4汇编调用C函数

main.S

.section .data
.align 3

print_data:
        .string "big data: %d\n"

.section .text
.globl main
main:
        stp     x29, x30, [sp, -16]!

        mov x0, #6
        mov x1, #5
        bl compare_data

        mov x1, x0
        ldr x0, =print_data
        bl printf

        ldp  x29, x30, [sp], 16
        ret

compare.c

int compare_data(int a, int b)
{
        return (a >= b) ? a : b;
}

img

3-5GCC内联汇编

#include <stdio.h>
  
static int compare_data(int a, int b)
{
        int val;

        asm volatile (
                        "cmp %1, %2\n"
                        "csel %0, %1, %2, hi\n"
                        : "+r" (val)
                        : "r" (a), "r" (b)
                        : "memory");

        return val;
}

int main()
{
        int val;

        val = compare_data(5, 6);
        printf("big data: %d\n", val);

        val = compare_data(6, 4);
        printf("big data: %d\n", val);
}

img

3-6一个裸机程序

由于裸机没有操作系统,需自行编写链接脚本

SECTIONS
{
	.text.boot : { *(.text.boot) }
	.text : { *(.text) }
	.rodata : { *(.rodata) }
	.data : { *(.data) }
	. = ALIGN(0x8);
	bss_begin = .;
	.bss : { *(.bss*) } 
	bss_end = .;
}

在第1行中,SECTIONS 是 LS (Linker Script)语法中的关键命令,用来描述输出文件的内存布局。
SECTIONS命令告诉链接文件如何把输入文件的段映射到输出文件的各个段,如何将输入段合为输出段,以及如何把输出段放入程序地址空间(VMA)和进程地址空间(LMA)。
SECTIONS命令格式如下。

SECTIONS
{
sections-command
sections-command
...
}

sections-command有4种。

  • ENTRY命令。
  • 符号赋值语句。
  • 输出段的描述(output section description)。
  • 段的叠加描述(overlay description)。

在第3行中,“.”非常关键,它代表位置计数(Location Counter , LC),这里把.text段的链接地址被设置为0x0,这里链接地址指的是装载地址(load address)。

在第4行中,输出文件的.text.boot段内容由所有输入文件(其中的“”可理解为所有的.o文件,也就是二进制文件)的.text.boot段组成。
”可理解为所有的.o

在第5行中,输出文件的.text段内容由所有输入文件(其中的“*”可理解为所有的.o文件,也就是二进制文件)的.text段组成。

在第6行中,输出文件的.rodata段由所有输入文件的.rodata段组成。

在第7行中,输出文件的.data段由所有输入文件的.data段组成在第8行中,设置为按8个字节对齐。

在第9~11行中,定义了一个.bss 段。

posted @ 2023-06-01 09:11  郭幸坤  阅读(35)  评论(0编辑  收藏  举报
1