请教关于Linux下GCC嵌入汇编编译时的配置问题。

andrew80 2009-04-09 12:31:28
大家好!
我在Linux下使用GCC编译一个C语言嵌入汇编语言的程序。我用的是RHEL5。
开始编译时,提示找不到asm/atomic.h这个文件,我看了usr/include/asm下的确没有,上网搜了一下,发现在“/usr/src/kernels/2.6.18-128.el5-i686/include/asm”有。我就把“/usr/src/kernels/2.6.18-128.el5-i686/include”加入了环境变量C_INCLUDE_PATH和CPLUS_INCLUDE_PATH中,在编译的时候没有提示找不到atomic.h文件了,而是提示汇编那部分有语法错误,其实就是不认识汇编代码。估计是只添加了atomic.h这个头文件,但是没有添加相应的lib文件。我想请问如何解决这个问题呢?谢谢了!
...全文
548 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
andrew80 2009-04-09
  • 打赏
  • 举报
回复
错误为:

[root@localhost nsdpf]# make
gcc -c -g -D_BSD_SOURCE -D_BSD_SOURCE -D__BSD_SOURCE -D__FAVOR_BSD -DHAVE_NET_ETHERNET_H -DLIBNET_LIL_ENDIAN -Wall -DHAVE_ICMPHDR=1 -DHAVE_TCP_STATES=1 -DHAVE_BSD_UDPHDR=1 -I. -I/usr/include/pcap -I../libppf/include -I../stack/include checksum.c
checksum.c: In function ‘csum_partial’:
checksum.c:32: 错误:缺少结尾的 " 字符
checksum.c:33: 错误:expected string literal before ‘jz’
checksum.c:33:5: 错误:整数常量的“f”后缀无效
checksum.c:35:6: 错误:整数常量的“f”后缀无效
checksum.c:37:6: 错误:整数常量的“f”后缀无效
checksum.c:45:5: 错误:整数常量的“f”后缀无效
checksum.c:65:6: 错误:整数常量的“b”后缀无效
checksum.c:69:5: 错误:整数常量的“f”后缀无效
checksum.c:74:6: 错误:整数常量的“b”后缀无效
checksum.c:77:5: 错误:整数常量的“f”后缀无效
checksum.c:79:5: 错误:整数常量的“f”后缀无效
checksum.c:82:5: 错误:整数常量的“f”后缀无效
checksum.c:87: 错误:缺少结尾的 " 字符
checksum.c: In function ‘ip_fast_csum’:
checksum.c:106: 错误:缺少结尾的 " 字符
checksum.c:107: 错误:expected string literal before ‘movl’
checksum.c:109:10: 错误:整数常量的“f”后缀无效
checksum.c:116:10: 错误:整数常量的“b”后缀无效
checksum.c:124: 错误:缺少结尾的 " 字符
checksum.c: In function ‘csum_fold’:
checksum.c:140: 错误:缺少结尾的 " 字符
checksum.c:141: 错误:expected string literal before ‘addl’
checksum.c:143: 错误:缺少结尾的 " 字符
checksum.c: In function ‘csum_tcpudp_magic’:
checksum.c:158: 错误:缺少结尾的 " 字符
checksum.c:159: 错误:expected string literal before ‘addl’
checksum.c:163: 错误:缺少结尾的 " 字符
checksum.c: In function ‘my_tcp_check’:
checksum.c:183: 警告:传递参数 1 (属于 ‘csum_partial’) 给指针时目标与指针有/无符号不一致
checksum.c: In function ‘my_udp_check’:
checksum.c:189: 警告:传递参数 1 (属于 ‘csum_partial’) 给指针时目标与指针有/无符号不一致
make: *** [checksum.o] 错误 1
andrew80 2009-04-09
  • 打赏
  • 举报
回复
忘了说,嵌入的代码为:

u_int

csum_partial(const u_char * buff, int len, u_int sum)

{

__asm__ (


"testl $2, %%esi

jz 2f

subl $2, %%ecx

jae 1f

addl $2, %%ecx

jmp 4f

1: movw (%%esi), %%bx

addl $2, %%esi

addw %%bx, %%ax

adcl $0, %%eax

2:

movl %%ecx, %%edx

shrl $5, %%ecx

jz 2f

testl %%esi, %%esi

1: movl (%%esi), %%ebx

adcl %%ebx, %%eax

movl 4(%%esi), %%ebx

adcl %%ebx, %%eax

movl 8(%%esi), %%ebx

adcl %%ebx, %%eax

movl 12(%%esi), %%ebx

adcl %%ebx, %%eax

movl 16(%%esi), %%ebx

adcl %%ebx, %%eax

movl 20(%%esi), %%ebx

adcl %%ebx, %%eax

movl 24(%%esi), %%ebx

adcl %%ebx, %%eax

movl 28(%%esi), %%ebx

adcl %%ebx, %%eax

lea 32(%%esi), %%esi

dec %%ecx

jne 1b

adcl $0, %%eax

2: movl %%edx, %%ecx

andl $0x1c, %%edx

je 4f

shrl $2, %%edx

3: adcl (%%esi), %%eax

lea 4(%%esi), %%esi

dec %%edx

jne 3b

adcl $0, %%eax

4: andl $3, %%ecx

jz 7f

cmpl $2, %%ecx

jb 5f

movw (%%esi),%%cx

leal 2(%%esi),%%esi

je 6f

shll $16,%%ecx

5: movb (%%esi),%%cl

6: addl %%ecx,%%eax

adcl $0, %%eax

7: "

: "=a"(sum)

: "0"(sum), "c"(len), "S"(buff)

: "bx", "dx");



return (sum);

}

andrew80 2009-04-09
  • 打赏
  • 举报
回复
楼上是说,每一行都要用双引号引起来?
abomber2 2009-04-09
  • 打赏
  • 举报
回复
换行符 \
xiaopoy 2009-04-09
  • 打赏
  • 举报
回复
每行都是一串字符。
"testl $2, %%esi "
"jz 2f "
"subl $2, %%ecx "

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧