Linux编程相关 - Notes

4 篇文章 0 订阅
3 篇文章 0 订阅

  1.

后缀名
文件类型
.c / .cc / .cxx
C++源代码文件, .c也可以是C源代码文件
.m
Objective-C源代码文件
.s
汇编语言源代码文件
.S
已预编译的汇编语言源代码文件
.i / .ii
已预处理过的C / C++源代码文件
.so
目标文件构成的动态库文件
.a
目标文件构成的静态库文件

 
 
2.

区别项
AT&T 格式
Intel 格式
指令大小写
多用小写 , movw %eax, %ebx
多用大写 , PUSH AX
寄存器名
寄存器名前加 % , %edi
寄存器前不加任何符号 , edi
/ 目的操作数
操作指 源操作数 目的操作数
mov %eax, %ebx : eax à ebx
操作指 目的操作数 源操作数
MOV EAX, EBX : EBX à EAX
操作数长度数位表示
操作码最后一字母表示长度位数 , 其中 b(16 ), w(32), l(64)
movb FOO, %al
操作数前加 BYTE PTR, WORD PTR DWORD PTR 限定位数
MOV AL, BYTE PTR FOO
立即数表示
立即数前加 $, push $2
不加任何符号 , PUSH 2
远程转移/ 调用指令
指令前加字符 l,
lcall, ljmp
指令后加 FAR,
CALL FAR, JMP FAR
间接寻址方式
Disp(base, index, scale), :
-8[%ebx, %eax, 2]
[BASE+INDEX*SCALE+DISP], :
[EBX+EAX*2-8]

 
 
3.
行内汇编:
asm(“statements”);
扩展行内汇编:
asm(“statements” : output_regs : input_regs : clobbered_regs);
如:
asm(“pubshb %al”);
asm(“movl %8, %3/n/t”
“testb %%al, %%al”
: ”=&S”(d0), “=&D”(d1), “=$a”(d2), “=$c”(d3)
: “0”(src), “1”(dest), “2”(0), “3”(0xffffffff), “g”(count)
: “memory”)
 
“=”号表示输出寄存器, 必须这样用
“$”是输出限定符, 它告诉GCC输出操作数使用的寄存器不可再让输入操作数使用.
“0”, “1”…这里包含%n的用法. 数字n表示的寄存器是按照出现和从左到右的顺序映射到寄存器的请求. 如%0表示的是esi, “0”(src)表示与%0使用同一个寄存器esi, 而它自己编号为%4.
由于使用了%0, %1这些表示法, 所以”%”有了特定的含义, 所以在汇编指令中出现的寄存器就必须用”%%”来表示, 如: “testb %%al, %%al”.
改变部分的”memory”是一个常用的限定, 表示汇编代码以不可预知的方式改变了内存. 这样, GCC在优化时就不会让缓存到寄存器的内存变量使用该寄存器通过汇编代码, 否则可能发生同步出错. 另外改变部分可以为空, 此时最后一个”:”可省略.
GCC允许在保留字的前后加上”__”, 如asm与__asm__是等效的, attribute与__attribute__是等效的.
GCC在处理汇编时, 把asm括号内的内容按原样拷贝到汇编文件中, 所以格式控制符(/n/t等)是必要的.
 
扩展行内汇编符号还包括:

符号
含义
m, v, h
内存单元
R
任何寄存器
Q
寄存器eax, ebx, ecx, edx之一
i, h
立即数
E, F
浮点数
G
任意
a, b, c, d
分别表示寄存器eax, ebx, ecx, edx
S, D
分别表示寄存器esi, edi
I
常数值(0~31)
A
装eax和edx合成一个64位的寄存器, 用于64位数的运算

 
 
4.
#gcc –E –o test.i test.c
#gcc –S test.c
#gcc –c test.c
#gcc –o test test.c
-E : 只预处理, 默认输出为标准输出
-S: 预处理和编译, 不进行汇编和链接, 自动生成汇编文件
-c: 执行预处理, 编译, 汇编而不链接, 生成.o的目标文件, 通常用于编译不包含主程序的子程序文件.
-o output_filename 这个文件不能与源文件同名, 默认为a.out
-g 包含调试信息, 用于调试
-O/-On: 设定优化, 分四级: -O0, 不优化; -O1/-O, 第一级优化, 允许与-g共用; -O2, 第二级优化; -O3: 第三级优化, 与-O2的区别在于打开了-finline-function选项. 允许把简单的函数直接插入到调用的代码处.
-I dirname: 将dirname所指出的目录加入到程序头文件目录列表中, 是预处理过程中使用的参数.
-L dirname: 同上, 只是库文件的目录.
 
5.
GDB小技巧:
l 调用shell命令:
(gdb)shell [commandline]
l 重复上次命令直接按回车键即可, 对单步执行很方便.
l 在运行程序时, 如果程序出错, 会在当前目录下生成一个名为core的文件. 这个文件是程序执行时的内存映像, 记录了各种状态等执行中的信息. GDB可根据core文件提供的信息, 找出程序执行发生错误的地方, 函数栈的状态及当时各变量的值.
#ulimit –c unlimited           获得运行core的权限
#gdb a.out core         运行a.out的core文件
(gdb)bt      显示堆栈帧
(gdb)flame n     激活main()中的栈帧n
 
 
6.
make语法小结:
1) make [-f 文件名] [其他选项] [目标名]
-f指出描述依赖关系的文件名. 一般默认为Makefie, makefile或GNUmakefile.
目标名不指定即为all.
-n 只显示生成指定目标的各命令, 并不实际执行这些命令,用来检查make文件中的错误.
-p 显示并检查make文件中的所有宏定义和所以内部规则, 在依赖关系描述语句中使用默认命令行的情况下, 这个功能很有用.
-C dir / --directory=dir 在读取Makefile文件之前把当前目录转为dir. 这在递归调用make时很有用.
2) 信赖关系一般的语法规则为:
target: dependency
         command
对于不希望回显的命令行, 在其前面加入@字符.
如果依赖关系较长, 用多行来表达时, 可用续行符”/”, 续行符之后同一行中不能有其他任何符号.
目标target前不能有空格, 命令行command之前也不能有空格, 而且必须有一个制表符tab.
3) 宏的定义和使用
用户自定义宏:
marco_name=string         #用macro_name代替string的值
macro_name:old_string=new_string                #用new_string来替换marco_name中的old_string, 生成新的宏, 但原来的宏macro_name不变
$(macro_name) 或者 ${macro_name}           #引用宏
常用的用户自定义宏, 记住这些就像各个Makefile作者的约定:
AS=as, ASFLAGS=, CC=cc或CC=gcc, CFLAGS=, CXX=g++, CPPFLAGS=, LD=ld, LDFLAGS=, LEX=lex, LFLAGS=.
内部宏:

内部宏
含义
$@
当前目标名
$*
去掉后缀的当前目标名
$<
依赖文件名
$?
依赖文件名, 这个文件是当前目标的信赖模块中比目标新的部分

扩展名规则(Suffix Rule)根据文件的扩展名来进行适当的运算操作. 如, .c一般指C源文件, .o一般指目标文件. 自动操作使.c文件编译后生成.o文件.
宏.SUFFIXES自动处Make文件中的文件扩展名, 如需自动处理.c, .o:
.SUFFIXES=.c .o
4) 符号
“%” 对应于具体的文件名, 如%.o: %.c表示源文件编译后产生同名的目标文件.
“@” 加在命令前, 表示命令本身不在屏幕上显示.
定义变量时有时会使用”:=”而不用”=”, 两者区别为:
“:=”是赋值, 而”=”指变量之间是相当的, 相当于C++程序中传值(“:=”)和传引用(“=”)的概念, 如:
A=gcc
B=$(A)
C:=$(A)
A=cc
此时结果为:
A=cc
B=cc
C=gcc
5) 函数
使用的格式如下:
$(funcname arg1, …, argn)
GNU make经典函数:
wildcard: 只有一个函数, 展开成一列所有符合由其参数描述成的文件名, 文件间以空格间隔, 如:
SOURCES=$(wildcard *.c)
它产生一个所有以”.c”为后缀名的文件列表, 然后存入变量SOURCES中.
patsubst: 即pattern substitude, 匹配替换. 它有三个参数, 分别为: 需要匹配的式样, 替换成的式样, 一个需要被处理的由空格分隔的字列, 如:
OBJECTS=$(patsubst %.c, %.o, $(SOURCES))
6) 用”#”注释.
7) make实例:
# 上层目录的Makefile文件
EXE
= test
OTHEROBJS
= sub/receive.o sub/send.o
DIRS
= sub
LDFLAGS
=
LIBS
=

# export作用是输出这些宏给子目录使用
export CC
= gcc
export CFLAGS
= -Wall -O

export CXX
= g++
export CXXFLAGS
= $(CFLAGS)

SRCS:
= $(wildcard *.c) $(wildcard *.cc)
OBJS:
= $(patsubst %.c , %.o , $(SRCS)) 
$(patsubst %.cc
, %.o , $(CXXSRCS))

all:subdirs $(EXE) $(OTHERS)

subdirs:
    @for dir in $(DIRS)
;  do $(MAKE) -C $$dir; done
#递归调用子目录下的Makefile文件

$(EXE):subdirs $(OBJS)
    $(CC) $(LDFLAGS) $(LIBS) -o $@ $(OBJS) $(OTHEROBJS)
#链接生成可执行文件

clean:
    -rm $(OBJS) $(EXE) $(OTHERS) *~
    @for dir in $(DIRS)
;  do $(MAKE) -C $$dir clean; done
#子目录Makefile
OTHERS
=
INCLUDES
=

SRCS:
= $(wildcard *.c)
OBJS:
= $(patsubst %.c , %.o , $(SRCS))

CFLAGS+
= -g

all:$(OBJS) $(OTHERS)

%.o:%.c
    $(CC) $(CFLAGS) $(INLCUDES) -c $< > $@
    
clean:
    -rm $(OBJS) $(OTHER) *~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值