ATT格式汇编语言
1.編譯與鏈接
方法一:使用as
#as -o test.o test.s
#ld -o test test.o
方法二:使用gcc
#gcc -o test test.s
gnu連接器查找_start標簽以確定程序的開始,但gcc查找main標簽,所以使用gcc要把 _start改為main
2.調試
#as -gstabs -o test.o test.s
#ld -o test test.o
參考:GDB調試--以匯編語言為例
3.定義數據
數據段
使用.data命令聲明 標簽+命令
.ascii 文本字符串
.asciz 以空字符結尾的文本字符串
.int 32位整數 .short 16位整數
.float 單精度浮點數 .double 雙精度浮點數
.quad 8字節整數
例如:
.section .data
output:
.ascii "This is a string"
height:
.int 78
length:
.int 34,79,90
靜態符號
equ命令用于把常量值設置為可以在文本段中使用的符號
例如:
.equ linux_sys_call ,0x80
使用靜態數據要加$
movl $linux_sys_call ,%eax
BSS段
.comm 聲明未初始化的數據的通用內存區域
.lcomm 聲明未初始化的數據的本地通用內存區域(為不會從本地匯編代碼之外進行訪問的數據保留的)
例如:
.section .bss
.lcomm buffer ,1000
把 1000字節的內存區域賦值給buffer標簽
一個程序本質上都是由 bss段、data段、text段三個組成的
在采用段式內存管理的架構中(比如intel的80x86系統),bss段(Block Started by Symbol segment)通常是指用來存放程序中未初始化的全局變量的一塊內存區域,一般在初始化時bss 段部分將會清零。bss段屬于靜態內存分配,即程序一開始就將其清零了。
比如,在C語言之類的程序編譯完成之后,已初始化的全局變量保存在.data 段中,未初始化的全局變量保存在.bss 段中。
參考:關于text段、data段和bss段以及堆棧
3.nop
空指令即空操作
4.cpuid
cpuid指令運行之后,分散在3個寄存器ebx,edx,ecx
(gdb) p/c $bx
$18 = 71 'G'
(gdb) p/c $bl
$19 = 71 'G'
(gdb) p/c $bh
$20 = 101 'e'
(gdb) p/c $cl
$21 = 110 'n'
(gdb) p/c $ch
$22 = 116 't'
(gdb) p/c $ecx
$23 = 110 'n'
(gdb) p/c $dh
$24 = 110 'n'
(gdb) p/c $dl
$25 = 105 'i'
5.linux系統調用
movl $1, %eax
movl $0, %ebx
int $0x80;從linux內核訪問控制臺顯示,使用int生成軟中斷,linux內核提供
參考:匯編語言Linux系統調用
6.指針
.section .data
output:
.ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
.section .text
.globl _start
_start:
movl $0, %eax
cpuid
movl $output, %edi ;output標簽的內存位置加載到edi寄存器中
movl %ebx, 28(%edi);ebx寄存器中的內容按照edi指針放到內存的指定位置。括號外的數字表示相對于output標簽放置數據的位置,這個數字和edi寄存器中的地址相加
movl %edx, 32(%edi)
movl %ecx, 36(%edi)
The processor Vendor ID is 'GenuineIntel'
7.使用C庫函數
printf
--《未完》--
總結
- 上一篇: C语言不要重复包含.h头文件和.c文件
- 下一篇: 关于text段、data段和bss段