彙編綱領:與硬件進行交互,將其他語言轉換成彙編
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.csdn.net/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文件