汇编和C语言

#file:hello.c
#include <stdio.h>
#include <string.h>

extern void printk(char);
extern int max_p(int, int);
char str[]="Hello world!\n";
int main()
{
	int i;
	for(i = 0; i < strlen(str); i++)
		printk(str[i]);
	int max = max_p(18, 200);
	printf("%d\n", max);
	printf("%d\n", max_p(10, 2));
}


#file: printk.s
#include <stdio.h>  
.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




#include <stdio.h>
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的字节数据 */


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值