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