新網站快速提高排名互換鏈接的方法
ld鏈接器筆記
1. 首先編寫一段匯編代碼
這里的匯編語法時 AT&T語法,是gcc原生支持的語法,底層使用 gas(gnu assembler) 完成匯編,相較于 Intel x86語法, AT&T 語法要更加古老,因此大多數(shù)人更加偏向于使用 Intel 的語法. nasm 編譯器支持x86語法.自從2.10版本,Intel語法可以通過使用.intel_syntax指令增加支持
.global _start.text
_start:mov $1,%eax # 將立即數(shù)1放到eax寄存器中mov $2,%ebx # 將立即數(shù)2放到 ebx 寄存器中add %ebx,%eax # 將 ebx 與 eax相加,結果放到 eax 中
loop:jmp loop # 循環(huán)
2. 使用 gcc 命令進行編譯
Makefile 文件內容:
main.o: main.sgcc -m32 -c $< -o $@
# -m32 編譯為32位代碼
# -c 執(zhí)行編譯和匯編,但不執(zhí)行鏈接
# -o 指定輸出文件名稱
# -E 執(zhí)行預處理,但不執(zhí)行編譯,匯編和鏈接
# -S 只執(zhí)行編譯,但不執(zhí)行匯編和鏈接
# -shared 創(chuàng)建一個共享庫,格式.so
3. 使用 ld 執(zhí)行鏈接
main: main.old -m elf_i386 main.o
# -m elf_i386 指定鏈接格式,這里指定為 elf 格式(linux中二進制格式)
# -o 指定輸出文件名稱
# ld 可以指定配置文件 map.lds,按照規(guī)格進行配置可以
4. 使用 gdb 執(zhí)行輸出
gdb main
# 開啟圖形界面
tui enable
# 打開匯編窗口
lay asm
# 打開寄存器窗口
lay reg
# 開始執(zhí)行程序
starti
# 步進執(zhí)行程序
si
# 之后可以通過回車執(zhí)行上一步執(zhí)行的命令
匯編代碼-棧學習
棧的使用主要是 push 和pop 指令,其中 push 指令會將指定數(shù)據(jù)寫入內存
push %ebp # 將 ebp 寄存器中的值壓入棧中
push $0xa # 將 0xa 值壓入棧中
還有 pop 指令,從棧頂彈出一個值到指定寄存器中
pop
.global _start.text
_start:push %ebpmov %esp,%ebppush $0xapush $0xbpop %eaxpush $4pop %eaxpop %ebx
loop:jmp loop
參考資料
xv6操作系統(tǒng)實踐