汇编纲领:与硬件进行交互,将其他语言转换成汇编
Hello World
以. 开头的都是汇编指示,指导汇编器如何进行汇编
其中.file 和 .def用于调试(通常可以忽略)
.text 代码段
.p2align a,b,c 指定下一行代码的对齐方式
a: 2^a次幂对齐
b: 使用b来填充
c: 最多填充多少字节
如 .p2align 4,,15 2^4对齐,空填充,最多填充15个字节
.section 对应于PE文件中的节区表
.equ factor,3 将factor设置为3 增加程序的可读性
以 : 结尾的字符串,是用以表示变量或者函数的地址符号
系统调用
1.搞清楚系统调用与函数调用的区别,king级别,由int $0x80系统中断
调用实例
如果不了解系统调用可以看这篇bolg
https://blog.youkuaiyun.com/hongbochen1223/article/details/46609877
系统调用参考网址
http://syscalls.kernelgrok.com
$p=传递p的地址,相当于&p
例如 char buf[12]
movl $buf ,%edi ---->相当于将buf的首地址传递到%edi中
movl $0x89123318 , 0x89237182 将$0x89123318当作常数,传入到地址为 0x89237182中
静态库文件 .a文件
将多个相关的重定位对象文件集成为一个单一的带索引的文件,称之为归档文件(Archive file).
ar rs libc.a \ ato.o printf.o random.o 将ato.o printf.o random.o 三个文件打包成libc.a
内存管理 malloc free
内存分为四个区,代码区,数据区,heap,stack
heap的上限称为 system break
可以通过系统调用brk(0)获得
也可以通过lib_c函数sbrk(0)
call No.45(%eax) 设置新的brk为%eax 返回新的brk存储到%eax中
Gcc
gcc -S -m32 -O2
gcc -O2 -mpreferred-stack-boundary=2 -S 将栈以2^2对齐,
gcc -romit-frame-pointer %ebp不做栈帧基址寄存器,被解放,由%esp做指针寄存器
as -O --32 my-object-file.o helloworld.s
ld -O my-exe-file -m elf_i386 my-object-file.o
编译出错时:sudo apt-get install g++-multilib
ld -lc -dynamic-linker /lib/ld-linux.so.2 -O cupid cpuid.o
将动态链接库/lib/ld-linux.so.2 生成cpuid.o可执行文件
ld -shared write-record.o read-record.o -O librecord.so
将 write-record.o和reed-record.o 链接成动态库文件 librecord.so
ld -L . -dynamic-linker /lib/ld-linux.so.2 -O write-records -l record write-recoreds.o
使用共享库文件
链接
-
将单个.o文件中被外部使用的符号写入符号表中,在PE文件中就是导出表
-
重定位,最后生成的文件必须是完整的,是一个单一的数据段和代码段,将.o文件的符号解析为一个绝对地址,然后将对象文件中符号引用更新为绝对地址
-
ELF对象文件标准的二进制格式(由AT&T)
.so 可在运行或者装载时候链接
.o : 可重定位的对象文件
新为绝对地址
3. ELF对象文件标准的二进制格式(由AT&T)
.so 可在运行或者装载时候链接
.o : 可重定位的对象文件
gcc -O2 -g -o p main.c swap.c 将main.c 和swap.c静态链接成p文件