linux彙編之程式結構:資料段:是可選的,資料段宣告帶有初始值的資料元素,這些資料元素用作組合語言程式中的變數。
bss段:是可選的,bss段宣告使用0或者null值初始化的資料元素,這些資料元素最常用作組合語言程式中的緩衝區。
文字段:所有的組合語言程式中都必須有文字段,這裡是可執行程式內宣告指令碼的地方。
定義段gun彙編器使用.section命令語句宣告段。.section語句只使用乙個引數---它宣告的段的型別。
有以下幾種段型別:
.section .data
.section .bss
.section .text
定義起始點
當組合語言程式被轉換為可執行檔案時,聯結器必須知道指令碼中的起始點是什麼。
為了解決這乙個問題,gun彙編器宣告乙個預設標籤,或者說識別符號,它應該用作應用程式的入口點。
_start標籤用於表明程式應該從這條指令開始執行。
因此,組合語言的模版應該是這樣的:
.section .data
.section .bss
.section .text
.globl _start
_start:
除了在應用程式中宣告起始標籤這外,還需要為外部應用程式提供入口點。這就是使用.globl命令完成。
.globl命令宣告外部程式可以訪問的程式標籤。
[root@proenv33 asm]# vim cpuid.s
[root@proenv33 asm]# cat cpuid.s
#cpud.s sample program to extrac the processor vendor id
.section .data
output:
.ascii "the processor vendor id is '************'\n"
#上面宣告了乙個變數,變數名為output,並且其為ascii型別的字元,這乙個字元是預定義的,是放到記憶體當中的。
.section .text
.globl _start
_start:
movl $0,%eax #初始化eax暫存器為0
cpuid #執行cpuid命令
movl $output,%edi #這時output變數是指標,把output變數的記憶體位置載入到edi暫存器當中
movl %ebx, 28(%edi)
movl %edx, 32(%edi)
movl %ecx, 36(%edi)
#上面是從三個寄存在器得到相應的值,分別放到變數的***位置上。
movl $4,%eax #指定eax的系統呼叫值,也就是指定系統呼叫函式,4代表著呼叫系統的write函式。
movl $1,%ebx #暫存器ebx指定要寫入的檔案描述符
movl $output,%ecx #暫存器ecx指定字串的開頭
movl $42, %edx #暫存器edx指定字串的長度
int $0x80 #生成乙個0x80的軟中斷
movl $1, %eax #呼叫系統退出函式1(退出函式)
movl $0, %ebx #暫存器ebx包含程式返回給shell的退出**值。
int $0x80 #生成乙個0x80的軟中斷
[root@proenv33 asm]# as -o cpuid.o cpuid.s
[root@proenv33 asm]# ld -o cpuid cpuid.o
[root@proenv33 asm]# ls
cpuid cpuid.o cpuid.s
[root@proenv33 asm]# ./cpuid
the processor vendor id is 'genuineintel'
linux彙編之程式結構
程式組成 資料段 是可選的,資料段宣告帶有初始值的資料元素,這些資料元素用作組合語言程式中的變數 bss段 是可選的,bss段宣告使用0或者null值初始化的資料元素,這些資料元素最常用作組合語言程式中的緩衝區。文字段 所有的組合語言程式中都必須有文字段,這裡是可執行程式內宣告指令碼的地方。定義段g...
c之程式結構
在我們學習 c 語言的基本構建塊之前,讓我們先來看看乙個最小的 c 程式結構,在接下來的章節中可以以此作為參考。c 程式主要包括以下部分 讓我們看一段簡單的 可以輸出單詞 hello world include stdio.h intmain 接下來我們講解一下上面這段程式 程式的第一行 inclu...
JAVA基礎之程式結構
順序結構 從上到下,從左到右。分支結構 a.單分支 if else if可以脫離else單獨用,裡面是boolean表示式 b.多分支 1.if else if else 2.switch case後面不能重複,為防止穿透後面接break switch 括號裡面可以放的資料型別有int,char,b...