作業系統第二課 組合語言AT T的基本了解

2021-08-28 04:00:51 字數 3799 閱讀 7091

linux源**中除了bootsect.s和head.s使用intel組合語言之外,其他的源**都是使用at&t組合語言。雖然本科期間學習了組合語言的相關知識,但是還是沒有學習過at&t組合語言,因此在進行作業系統學習期間檢視源**時,會產生理解上的困難。這裡會對at&t的部分語言進行相應的介紹:

.globl begtext, begdata, begbss, endtext, enddata, endbss

.text

begtext:

.data

begdata:

.bss

begbss:

.text

entry start

start:

在setup.s源**的開始部分會出現上面的**,那麼每個表示的是什麼意思呢?下面將做一一講解。

.text:表示該節中包含程式的**,需指出該節是唯讀節。

.data

:這種節包含程式已初始化的資料,也就是說,包含具有初值的那些變數

.bss:

•這個節包含程式還未初始化的資料,也就是說,包含沒有初值的那些變數。當作業系統裝入這個程式時將把這些變數都置為0

•使用.bss

比使用.data

的優勢在於,

.bss

節在編譯後不占用磁碟的空間,這樣編譯、連線生成的**的尺寸會比較小。 •

儘管在磁碟上不佔空間,但是在可執行檔案被讀入記憶體後系統還是會為

.bss

節分配記憶體

.ascii

:語法:

.ascii 

「string」…

. •ascii 表示零個或多個(

用逗號隔開

)字串,並把每個字串

(結尾不自動加「\0

」字元)中的字元放在連續的位址單元。於此類似的

.asciz

指令定義的字串會在結尾處自動加 「\0

」字元.fill

:語法:.fill repeat , size , value •

含義是反覆拷貝size個位元組,重複

repeat

次 ,其中

size

和value

是可選的,預設值分別為1和

0 .globl

:語法:.

globl

symbol •

.globl使得連線程式(ld

)能夠看到

symbol

。如果你的區域性程式中定義了

symbol

,那麼,與這個區域性程式連線的其他區域性程式也能訪問

symbol

.rept  endr

:語法:

.rept

count ……

. .endr •

把.rept

指令與.

endr

指令之間的行重複

count次

.space

:語法:.space size , fill •

這個指令保留size個位元組的空間,每個位元組的值為

fill

.byte/.word/.long

:語法:.byte/.word/.long expressions •

預留1個位元組/字

/雙字,並將這個位元組的內容賦值為

expression

,若是用逗號隔開的多個

expression

,則為預留多個這樣的位元組/字

/雙字,並將它們的內容依次賦值。

.set

:設定常數,就好像c

程式中的

#define

的作用一樣

at&t彙編格式

#hello.s 

.data # 資料段宣告

msg : .string "hello, world!\\n" # 要輸出的字串

len = . - msg # 字串長度

.text # **段宣告

.global _start # 指定入口函式

_start: # 在螢幕上顯示乙個字串

movl $len, %edx # 引數三:字串長度

movl $msg, %ecx # 引數二:要顯示的字串

movl $1, %ebx # 引數一:檔案描述符(stdout)

movl $4, %eax # 系統呼叫號(sys_write)

int $0x80 # 呼叫核心功能

# 退出程式

movl $0,%ebx # 引數一:退出**

movl $1,%eax # 系統呼叫號(sys_exit)

int $0x80 # 呼叫核心功能

兩個語法之間的區別:

1.定址方式:intel的指令格式是

segreg:[

base+index

*scale+disp],而

at&t

的格式是

%segreg

:disp

(base,index,scale)。

intel語法

at&t語法

[eax]

(%eax)

[eax

+_variable]

_variable(%eax)

[eax*4

+_array]

_array(,%eax,4)

[ebx

+eax*8

+_array]

_array(%ebx,%eax,8)

2.標識長度的操作碼字首:在at&t彙編中遠端跳轉指令和子過程呼叫指令的操作碼使用字首「l

」,分別為

ljmp

,lcall

,與之相應的返回指令偽

lret

。例如:

intel語法

at&t語法

call section:offset

lcall $secion:$offset

jmp far section:offset

ljmp $secion:$offset

ret far stack_adjust

lret

$stack_adjust

3.標識長度的操作碼字尾:在at&t

的操作碼後面有時還會有乙個字尾,其含義就是指出操作碼的大小。「l

」表示長整數(

32位),「w

」表示字(

16位),「b

」表示位元組(

8位)。而在

intel

的語法中,則要在記憶體單元運算元的前面加上

byte

ptr、

word

ptr,

和dword

ptr,

「dword」對應

「long」。

intel語法

at&t語法

mov     al,bl

movb    %bl,%al

mov     ax,bx

movw   %bx,%ax

mov     eax,ebx

movl     %ebx,%eax

moveax,

dword

ptr[

ebx]

movl

(%ebx

),%eax

作業系統組合語言之AT T指令

計算機系統結構cpu內部 1.pc program counter 指令指標暫存器 指向下一條指令的位址 eip x86 32 或者 rip x86 64 2.暫存器與暫存器堆 registers 在處理器cpu內部以名字來訪問的快速儲存單元 3.條件狀態碼 condition codes 用於儲存...

作業系統組合語言之AT T指令

計算機系統結構cpu內部 1.pc program counter 指令指標暫存器 指向下一條指令的位址 eip x86 32 或者 rip x86 64 2.暫存器與暫存器堆 registers 在處理器cpu內部以名字來訪問的快速儲存單元 3.條件狀態碼 condition codes 用於儲存...

易語言學習第二課

知識點 1.如果 相當於if else 2.如果真 相當於if 3.且 或 不等於 前後要有空格 4.獲取焦點 控制項.獲取焦點 5.返回 前面不用加控制項名,不銷毀視窗,不往下執行了 6.銷毀 前面不用加控制項名,視窗消失 題外話 每個控制項都有很多事件處理子程式,比如滾動獲取焦點等等 版本 2 ...