c语言字节汇编代码,汇编和C语言

#file:hello.c

#include 

#include 

externvoidprintk(char);

externintmax_p(int,int);

charstr[]="Hello world!\n";

intmain()

{

inti;

for(i = 0; i 

printk(str[i]);

intmax = max_p(18, 200);

printf("%d\n", max);

printf("%d\n", max_p(10, 2));

}

#file: printk.s

#include 

.text

.global printk

.type printk, %function

.global max_p

.type max_p, %function

.align

printk:

.fnstart

stmfd    sp!, {r0, r4-r7, lr} /*寄存器压栈*/

mov r1, r0

mov r0, r1

bl putchar

return:

ldmfd    sp!, {r0, r4-r7, pc} /* lr保存PC的值, input parameter:R0 ~ R3, return: R0 */

.fnend

max_p:

/*.fnstart*/

stmfd   sp!, {r4-r7, lr}

cmp r0, r1

bcs 1f    /* cs为条件判断,大于等于0 */

mov r0, r1

1:    ldmfd   sp!, {r4-r7, pc}

/*    .fnend*/

#file:build.sh

#!/bin/sh

arm-none-linux-gnueabi-as printk.s -o printk.o

arm-none-linux-gnueabi-gcc -c hello.c

arm-none-linux-gnueabi-gcc -static hello.o printk.o -o hello

733b6db9b2fc16dcec13a1eb4fbd486c.png

include

memset:

/* compute the offset to align the destination

* offset = (4-(src&3))&3 = -src & 3

*/

.fnstart

.save       {r0, r4-r7, lr}

stmfd       sp!, {r0, r4-r7, lr}

rsb         r3, r0, #0

ands        r3, r3, #3

cmp         r3, r2

movhi       r3, r2

/* splat r1 */

mov         r1, r1, lsl #24

orr         r1, r1, r1, lsr #8

orr         r1, r1, r1, lsr #16

/* memset(void *, int, int) 第二个参数只取低8位数据, 其他位使用该位填冲 */

/* 如果不对齐,数据以此拷贝,如r3=3, r3 << 31后cs标志位有效,同时r12的最高位位1,mi有效 */

movs        r12, r3, lsl #31

strcsb      r1, [r0], #1    /* can't use strh (alignment unknown) */

strcsb      r1, [r0], #1

strmib      r1, [r0], #1

subs        r2, r2, r3  /* 1 ~3 个数据的情况下,函数返回 */

ldmlsfd     sp!, {r0, r4-r7, lr}   /* ls标志位表示小于或者等于0, return */

bxls        lr

/* align the destination to a cache-line */

mov         r12, r1

mov         lr, r1

mov         r4, r1

mov         r5, r1

mov         r6, r1

mov         r7, r1  /* 还有r1本身和r3 */

rsb         r3, r0, #0

ands        r3, r3, #0x1C

beq         aligned32  /* 32个字节对齐的情况下 */

cmp         r3, r2       /* 计算出和32个字节对齐还需操作多少个字节 */

andhi       r3, r2, #0x1C

sub         r2, r2, r3

/* conditionnaly writes 0 to 7 words (length in r3) */

/* 最多有28个字节:16 + 8 + 4 */

movs        r3, r3, lsl #28

stmcsia     r0!, {r1, lr}

stmcsia     r0!, {r1, lr}

stmmiia     r0!, {r1, lr}

movs        r3, r3, lsl #2

strcs       r1, [r0], #4

aligned32:

subs        r2, r2, #32   /* count -= 32 */

mov         r3, r1

bmi         2f

1:      subs        r2, r2, #32

stmia       r0!, {r1,r3,r4,r5,r6,r7,r12,lr}   /* 一次存储32Bytes */

bhs         1b  /* 大于等于0的情况下循环:do {r2=r2 -32; copy;}while(r2>=0); */

2:      add         r2, r2, #32  /* 最后的0 ~ 31的字节数据 */

(huyugv_830913)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值