06 08x86彙編編程

彙編綱領:與硬件進行交互,將其他語言轉換成彙編

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
使用共享庫文件

鏈接

  1. 將單個.o文件中被外部使用的符號寫入符號表中,在PE文件中就是導出表

  2. 重定位,最後生成的文件必須是完整的,是一個單一的數據段和代碼段,將.o文件的符號解析爲一個絕對地址,然後將對象文件中符號引用更新爲絕對地址

  3. 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文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章