arm汇编指令详解,MOV指令,strlen函数

29365人阅读
Linux C/C++(40)
函数名: strdup
功& 能: 将串拷贝到新建的位置处
用& 法: char *strdup(char *str);
这个函数在linux的man手册里解释为:
The strdup() function returns a pointer toa new string which is a
duplicate of the string s. Memory for thenew string is obtained with
malloc(3), and can be freed with free(3).
The strndup() function is similar, but onlycopies at most n charac-
ters. If s is longer than n, only ncharacters are copied, and a termi-
nating NUL is added.
strdup函数原型:
strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干。strdup函数复制一个字符串,使用完后要记得删除在函数中动态申请的内存,strdup函数的参数不能为NULL,一旦为NULL,就会报段错误,因为该函数包括了strlen函数,而该函数参数不能是NULL。
strdup的工作原理:
char * __strdup (const char *s)
size_t len =strlen (s) + 1;
void *new =malloc (len);
if (new == NULL)
return NULL;
return (char *)memcpy (new, s, len);
C/C++ code
#include &stdio.h&
#include &string.h&
#include &alloc.h&
int main(void)
char *dup_str,*string = &abcde&;
dup_str =strdup(string);
&&&&& printf(&%s\n&, dup_str);free(dup_str); return 0;
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
unsigned int Test()
charbuf[]=&Hello,World!&;
char* pb =strndup(buf,strlen(buf));
return (unsignedint)(pb);
int main()
unsigned int pch= Test();
printf(&Testing:%s\n&,(char*)pch);
free((void*)pch);
在Test函数里使用strndup而出了Test函数仍可以操作这段内存,并且可以释放。
由这个问题而延伸出来的问题就是,如何让函数得到的内存数据传出函数但仍可用。
解决方法目前本人只想到两个: 一个外部变量,如传递一个内存块指针给函数,但这种做法就是你得传递足够的内存,也就是你不能事先知道这个函数到底要多大的BUFFER。
&另一种方法就是在函数内部申请static变量,当然这也是全局区的变量,但这种做法的缺点就是,当函数多次运行时,static变量里面的数据会被覆盖。这种类型的另一个方法就是使用全局变量,但这和使用static变量很相同,不同的是全局变量可以操作控制,而static变量如果不把它传出函数,就不可对它操作控制了。另一类方法就是上面所述的,利用堆里的内存来实现,但存在危险。strdup是从堆中分配空间的!strdup调用了malloc,所以它需要释放!对于堆栈:堆是由程序员来管理的,比如说new,malloc等等都是在堆上分配的!
栈是由编译器来管理的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1084726次
积分:9024
积分:9024
排名:第1630名
原创:79篇
转载:212篇
评论:98条
(1)(7)(1)(1)(1)(11)(2)(1)(2)(1)(3)(1)(3)(1)(7)(14)(1)(4)(1)(1)(4)(3)(1)(33)(8)(58)(26)(3)(1)(24)(28)(18)(3)(3)(6)(10)(1)3467人阅读
ARM Linux开发(53)
自己动手实现arm函数栈帧回溯内核版本:2.6.14glibc版本:2.3.6CPU平台:arm glic中其实有这些函数,当时用的uclib版本较低,没有这些函数,但又需要,只能自己实现了(较高的版本应该有这些函数,换版本很麻烦),而且可以加深自己对这方面的理解.原理性的东西就不深入讲解了,直接上例子!#include &stdio.h&
#include &stdlib.h&
#include &signal.h&
#include &assert.h&
#include &ucontext.h&
void A(int a);
void B(int b);
void C(int c);
void DebugBacktrace(unsigned int sn , siginfo_t
*si , void *ptr);
typedef struct
const char *dli_ /* File name of defining object.
void *dli_
/* Load address of that object.
const char *dli_ /* Name of nearest symbol.比如函数名*/
void *dli_
/* Exact value of nearest symbol.比如函数的起始地址*/
struct ucontext_ce123 {
unsigned long
struct ucontext
struct sigcontext uc_
uc_ /* mask last for extensibility */
}ucontext_ce123_;
struct sigframe_ce123 {
//保存一组寄存器上下文
unsigned long extramask[1];
u//保存返回地址
//struct aux_sigframe aux __attribute__((aligned(8)));
}sigframe_ce123;
int backtrace_ce123 (void **array, int size);
char ** backtrace_symbols_ce123 (void *const *array, int size);
int backtrace_ce123 (void **array, int size)
if (size &= 0)
int *fp = 0, *next_fp = 0;
int cnt = 0;
int ret = 0;
&mov %0, fp\n&
: &=r&(fp)
array[cnt++] = (void *)(*(fp-1));
next_fp = (int *)(*(fp-3));
while((cnt &= size) && (next_fp != 0))
array[cnt++] = (void *)*(next_fp - 1);
next_fp = (int *)(*(next_fp-3));
ret = ((cnt &= size)?cnt:size);
printf(&Backstrace (%d deep)\n&, ret);
char ** backtrace_symbols_ce123 (void *const *array, int size)
# define WORD_WIDTH 8
Dl_info info[size];
int status[size];
size_t total = 0;
/* Fill in the information we can get from `dladdr'.
for (cnt = 0; cnt & ++cnt)
status[cnt] = _dl_addr (array[cnt], &info[cnt]);
if (status[cnt] && info[cnt].dli_fname && info[cnt].dli_fname[0] != '\0')
/* We have some info, compute the length of the string which will be
&&file-name&(&sym-name&) [+offset].
total += (strlen (info[cnt].dli_fname ?: &&)
+ (info[cnt].dli_sname ? strlen (info[cnt].dli_sname) + 3 + WORD_WIDTH + 3 : 1)
+ WORD_WIDTH + 5);
total += 5 + WORD_WIDTH;
/* Allocate memory for the result.
result = (char **) malloc (size * sizeof (char *) + total);
if (result != NULL)
char *last = (char *) (result + size);
for (cnt = 0; cnt & ++cnt)
result[cnt] =
if (status[cnt] && info[cnt].dli_fname && info[cnt].dli_fname[0] != '\0')
char buf[20];
if (array[cnt] &= (void *) info[cnt].dli_saddr)
sprintf (buf, &+%#lx&, \
(unsigned long)(array[cnt] - info[cnt].dli_saddr));
sprintf (buf, &-%#lx&, \
(unsigned long)(info[cnt].dli_saddr - array[cnt]));
last += 1 + sprintf (last, &%s%s%s%s%s[%p]&,
info[cnt].dli_fname ?: &&,
info[cnt].dli_sname ? &(& : &&,
info[cnt].dli_sname ?: &&,
info[cnt].dli_sname ? buf : &&,
info[cnt].dli_sname ? &) & : & &,
array[cnt]);
last += 1 + sprintf (last, &[%p]&, array[cnt]);
assert (last &= (char *) result + size * sizeof (char *) + total);
void A(int a)
printf(&%d: A call B\n&, a);
void B(int b)
printf(&%d: B call C\n&, b);
/* 这个函数调用将导致段错误*/
void C(int c)
char *p = (char *)c;
/* 如果参数c不是一个可用的地址值,则这条语句导致段错误 */
printf(&%d: function C\n&, c);
/* SIGSEGV信号的处理函数,回溯栈,打印函数的调用关系*/
void DebugBacktrace(unsigned int sn , siginfo_t
*si , void *ptr)
/*int *ip = 0;
&mov %0, ip\n&
: &=r&(ip)
printf(&sp = 0x%x\n&, ip);
struct sigframe_ce123 * sigframe = (struct sigframe_ce123 * )*/
if(NULL != ptr)
printf(&\n\nunhandled page fault (%d) at: 0x%08x\n&, si-&si_signo,si-&si_addr);
struct ucontext_ce123 *ucontext = (struct ucontext_ce123 *)
int pc = ucontext-&uc_mcontext.arm_
void *pc_array[1];
pc_array[0] =
char **pc_name = backtrace_symbols_ce123(pc_array, 1);
printf(&%d: %s\n&, 0, *pc_name);
#define SIZE 100
void *array[SIZE];
size = backtrace_ce123(array, SIZE);
strings = backtrace_symbols_ce123(array, size);
for(i=0;i&i++)
printf(&%d: %s\n&, i+1, strings[i]);
free(strings);
printf(&error!\n&);
int main(int argc, char **argv)
s.sa_flags = SA_SIGINFO;
s.sa_sigaction = (void *)DebugB
sigaction (SIGSEGV,&s,NULL);
代码的下载地址:http://download.csdn.net/detail/ce123/5063160编译命令:arm-linux-gcc -rdynamic -o segfault segfault.c_dl_addr链接不通过时,使用-ldl。如果没有该函数,可用dladdr函数代替。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2120604次
积分:26711
积分:26711
排名:第173名
原创:346篇
转载:29篇
评论:950条
文章:15篇
阅读:112565
文章:34篇
阅读:410255
文章:14篇
阅读:55049
文章:62篇
阅读:608336
(1)(1)(3)(1)(1)(1)(1)(4)(4)(4)(4)(7)(4)(12)(5)(13)(11)(4)(4)(4)(15)(5)(1)(5)(16)(14)(7)(1)(1)(7)(1)(1)(4)(11)(16)(11)(7)(45)(38)(18)(29)(39)21ic官方微信-->
后使用快捷导航没有帐号?
查看: 5161|回复: 7
C的strlen的函数体在哪
keil的string.h里没有
&&已结帖(20)
主题帖子积分
资深技术员, 积分 480, 距离下一级还需 20 积分
资深技术员, 积分 480, 距离下一级还需 20 积分
主题帖子积分
专家等级:结帖率:33%
主题帖子积分
资深技术员, 积分 480, 距离下一级还需 20 积分
资深技术员, 积分 480, 距离下一级还需 20 积分
strlen的函数体在哪& &keil的string.h里没有
, , , , , , ,
满意回复+20
呵呵,strlen.OBJ代码在C51S.LIB里;有耐心的话,调用后在编译结果里看汇编代码吧。
主题帖子积分
资深技术员, 积分 480, 距离下一级还需 20 积分
资深技术员, 积分 480, 距离下一级还需 20 积分
主题帖子积分
专家等级:结帖率:33%
主题帖子积分
资深技术员, 积分 480, 距离下一级还需 20 积分
资深技术员, 积分 480, 距离下一级还需 20 积分
主题帖子积分
中级技术员, 积分 100, 距离下一级还需 200 积分
中级技术员, 积分 100, 距离下一级还需 200 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 100, 距离下一级还需 200 积分
中级技术员, 积分 100, 距离下一级还需 200 积分
你看看在math.h中有没有?
主题帖子积分
初级工程师, 积分 2701, 距离下一级还需 299 积分
初级工程师, 积分 2701, 距离下一级还需 299 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2701, 距离下一级还需 299 积分
初级工程师, 积分 2701, 距离下一级还需 299 积分
有,就在 string.h,
extern int strlen (char *);
主题帖子积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
这些函数的实现代码,你是看不到的。比如 ,你见过 math.h中 sin 函数具体是怎么实现的吗
振南的znFAT -- 单片机上上的FAT32文件系统
主题帖子积分
主题帖子积分
专家等级:结帖率:92%
主题帖子积分
这是库函数 你如何看得到实现?
主题帖子积分
中级工程师, 积分 3165, 距离下一级还需 1835 积分
中级工程师, 积分 3165, 距离下一级还需 1835 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级工程师, 积分 3165, 距离下一级还需 1835 积分
中级工程师, 积分 3165, 距离下一级还需 1835 积分
呵呵,strlen.OBJ代码在C51S.LIB里;有耐心的话,调用后在编译结果里看汇编代码吧。
要想让别人关照自己的自尊,首先自己先要有所成就才行。
主题帖子积分
技术总监, 积分 39953, 距离下一级还需 10047 积分
技术总监, 积分 39953, 距离下一级还需 10047 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 39953, 距离下一级还需 10047 积分
技术总监, 积分 39953, 距离下一级还需 10047 积分
这是标准的库函数
时间类勋章
技术高手奖章
人才类勋章
技术奇才奖章
人才类勋章
精华达人奖章
等级类勋章
社区建设奖章
等级类勋章
欢快之小溪
发帖类勋章
时间类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
荣誉元老奖章
等级类勋章
热门推荐 /2您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于corte-m3的以太网串口服务器的设计与实现.pdf60页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:300 &&
基于corte-m3的以太网串口服务器的设计与实现
你可能关注的文档:
··········
··········
摘要 在传统的门禁系统、pos消费系统、考勤系统、安防系统、医疗设备系统和
工业控制系统中,有大量的传感器、读卡器、检测器等等许多现场设备需要连接
来采集数据,由于串行通信在近距离传输数据时易于实现和维护并能保证较高的
数据传输安全性,因此串行通信被广泛应用。但是,串行通信传输速度慢、传输
距离相对较近,距离较远时其传输可靠性存在较大缺陷,若是要处理成百上千的
传感器、检测器等现场设备与远端主机之间的数据传输甚至与多个主机进行通
信,采用串行总线通信的控制网络将会十分庞杂。由于串行通信技术本身的局限
性,单纯依靠它来实现控制系统中的传感器、检测器等现场设备与远端主机之间 的数据传输显然存在许多局限性,势必不利于自动化控制系统的发展。 随着计算机技术、自动化控制技术以及通信技术的发展,传统的控制技术正
经历着一场史无前例的革新,逐渐向网络化发展。对语音、图像等等这些要求大
数据量、高速率传输信号的需求,又促使现在在业界内盛行的以太网与控制网络
的联合。 本文根据工业控制环境的特点需要,以基于Cortex.M3内核的微控制器
LPCI768为核心设计了低成本的嵌入式串口服务器,使分散于工业控制现场层的
多个RS.485串口设备无缝接入工业以太网,以实现工业监控的数据采集、传输
和设备控制的分布式智能化管理。 本文主要内容是介绍串口服务器在控制系统中的意义和作用,并实现了基于
I-tc/os.II和嵌入式TCP/IP协议栈的串口服务器的完整设计。 设计主要包括三个部分的内容: 1 以LPCI768为核心的硬件平台的设计:主要的电路包括以太网接口电
路,电源及复位电路,串口扩展电
正在加载中,请稍后...502 Bad Gateway
502 Bad Gateway}

我要回帖

更多关于 汇编mov指令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信