织梦CMS - 轻松建站从此开始!

罗索

汇编和C语言

落鹤生 发布于 2012-11-16 17:37 点击:次 
汇编入门: 汇编与C语言的代码对照。
TAG:

#file:hello.c

  1. #include <stdio.h> 
  2. #include <string.h> 
  3.  
  4. extern void printk(char); 
  5. extern int max_p(intint); 
  6. char str[]="Hello world!\n"
  7. int main() 
  8.     int i; 
  9.     for(i = 0; i < strlen(str); i++) 
  10.         printk(str[i]); 
  11.     int max = max_p(18, 200); 
  12.     printf("%d\n", max); 
  13.     printf("%d\n", max_p(10, 2)); 

#file: printk.s

  1. #include <stdio.h>  
  2. .text  
  3.  
  4. .global printk 
  5. .type printk, %function  
  6.  
  7. .global max_p 
  8. .type max_p, %function  
  9.  
  10. .align 
  11.  
  12. printk: 
  13.     .fnstart 
  14.     stmfd    sp!, {r0, r4-r7, lr} /*寄存器压栈*/ 
  15.     mov r1, r0 
  16.     mov r0, r1 
  17.     bl putchar 
  18. return
  19.     ldmfd    sp!, {r0, r4-r7, pc} /* lr保存PC的值, input parameter:R0 ~ R3, return: R0 */ 
  20.     .fnend 
  21.  
  22. max_p: 
  23.     /*.fnstart*/ 
  24.     stmfd   sp!, {r4-r7, lr} 
  25.     cmp r0, r1 
  26.     bcs 1f    /* cs为条件判断,大于等于0 */ 
  27.     mov r0, r1 
  28. 1:    ldmfd   sp!, {r4-r7, pc} 
  29. /*    .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的字节数据 */

(huyugv_830913)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201211/16375.html]
本文出处:CSDN博客 作者:huyugv_830913 原文
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容