linux彙編之程式結構

2021-07-29 20:44:32 字數 1893 閱讀 2543

程式組成:

資料段:是可選的,資料段宣告帶有初始值的資料元素,這些資料元素用作組合語言程式中的變數

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彙編之程式結構

linux彙編之程式結構 資料段 是可選的,資料段宣告帶有初始值的資料元素,這些資料元素用作組合語言程式中的變數。bss段 是可選的,bss段宣告使用0或者null值初始化的資料元素,這些資料元素最常用作組合語言程式中的緩衝區。文字段 所有的組合語言程式中都必須有文字段,這裡是可執行程式內宣告指令碼...

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...