色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>匯編編程>

Linux 匯編語言開發指南詳解

大小:0.5 MB 人氣: 2017-11-02 需要積分:1
 匯編語言的優點是速度快,可以直接對硬件進行操作,這對諸如圖形處理等關鍵應用是非常重要的。Linux 是一個用 C 語言開發的操作系統,這使得很多程序員開始忘記在 Linux 中還可以直接使用匯編這一底層語言來優化程序的性能。本文為那些在Linux 平臺上編寫匯編代碼的程序員提供指南,介紹 Linux 匯編語言的語法格式和開發工具,并輔以具體的例子講述如何開發實用的Linux 匯編程序。
  一、簡介
  作為最基本的編程語言之一,匯編語言雖然應用的范圍不算很廣,但重要性卻勿庸置疑,因為它能夠完成許多其它語言所無法完成的功能。就拿 Linux 內核來講,雖然絕大部分代碼是用 C 語言編寫的,但仍然不可避免地在某些關鍵地方使用了匯編代碼,其中主要是在 Linux 的啟動部分。由于這部分代碼與硬件的關系非常密切,即使是 C 語言也會有些力不從心,而匯編語言則能夠很好揚長避短,最大限度地發揮硬件的性能。
  大多數情況下 Linux 程序員不需要使用匯編語言,因為即便是硬件驅動這樣的底層程序在 Linux 操作系統中也可以用完全用 C 語言來實現,再加上 GCC 這一優秀的編譯器目前已經能夠對最終生成的代碼進行很好的優化,的確有足夠的理由讓我們可以暫時將匯編語言拋在一邊了。但實現情況是 Linux 程序員有時還是需要使用匯編,或者不得不使用匯編,理由很簡單:精簡、高效和 libc 無關性。假設要移植 Linux 到某一特定的嵌入式硬件環境下,首先必然面臨如何減少系統大小、提高執行效率等問題,此時或許只有匯編語言能幫上忙了。
  匯編語言直接同計算機的底層軟件甚至硬件進行交互,它具有如下一些優點:
  能夠直接訪問與硬件相關的存儲器或 I/O 端口
  能夠不受編譯器的限制,對生成的二進制代碼進行完全的控制;
  能夠對關鍵代碼進行更準確的控制,避免因線程共同訪問或者硬件設備共享引起的死鎖;
  能夠根據特定的應用對代碼做最佳的優化,提高運行速度;
  能夠最大限度地發揮硬件的功能。
  同時還應該認識到,匯編語言是一種層次非常低的語言,它僅僅高于直接手工編寫二進制的機器指令碼,因此不可避免地存在一些缺點:
  編寫的代碼非常難懂,不好維護;
  很容易產生 bug,難于調試;
  只能針對特定的體系結構和處理器進行優化;
  開發效率很低,時間長且單調。
  Linux 下用匯編語言編寫的代碼具有兩種不同的形式。第一種是完全的匯編代碼,指的是整個程序全部用匯編語言編寫。盡管是完全的匯編代碼,Linux 平臺下的匯編工具也吸收了 C 語言的長處,使得程序員可以使用 #include、#ifdef 等預處理指令,并能夠通過宏定義來簡化代碼。第二種是內嵌的匯編代碼,指的是可以嵌入到C語言程序中的匯編代碼片段。雖然 ANSI 的 C 語言標準中沒有關于內嵌匯編代碼的相應規定,但各種實際使用的 C 編譯器都做了這方面的擴充,這其中當然就包括 Linux 平臺下的 GCC。
  二、Linux 匯編語法格式
  絕大多數 Linux 程序員以前只接觸過DOS/Windows 下的匯編語言,這些匯編代碼都是 Intel 風格的。但在 Unix 和 Linux 系統中,更多采用的還是 AT&T 格式,兩者在語法格式上有著很大的不同:
  在 AT&T 匯編格式中,寄存器名要加上 ‘%’ 作為前綴;而在 Intel 匯編格式中,寄存器名不需要加前綴。例如:
  AT&T 格式Intel 格式
  pushl %eaxpush eax
  在 AT&T 匯編格式中,用 ‘$’ 前綴表示一個立即操作數;而在 Intel 匯編格式中,立即數的表示不用帶任何前綴。例如:
  AT&T 格式Intel 格式
  pushl $1push 1
  AT&T 和 Intel 格式中的源操作數和目標操作數的位置正好相反。在 Intel 匯編格式中,目標操作數在源操作數的左邊;而在 AT&T 匯編格式中,目標操作數在源操作數的右邊。例如:
  AT&T 格式Intel 格式
  addl $1, %eaxadd eax, 1
  在 AT&T 匯編格式中,操作數的字長由操作符的最后一個字母決定,后綴‘b’、‘w’、‘l’分別表示操作數為字節(byte,8 比特)、字(word,16 比特)和長字(long,32比特);而在 Intel 匯編格式中,操作數的字長是用 “byte ptr” 和 “word ptr” 等前綴來表示的。例如:
  AT&T 格式Intel 格式
  movb val, %almov al, byte ptr val
  在 AT&T 匯編格式中,絕對轉移和調用指令(jump/call)的操作數前要加上‘*’作為前綴,而在 Intel 格式中則不需要。
  遠程轉移指令和遠程子調用指令的操作碼,在 AT&T 匯編格式中為 “ljump” 和 “lcall”,而在 Intel 匯編格式中則為 “jmp far” 和 “call far”,即:
  AT&T 格式Intel 格式
  ljump $section, $offsetjmp far section:offset
  lcall $section, $offsetcall far section:offset
  與之相應的遠程返回指令則為:
  AT&T 格式Intel 格式
  lret $stack_adjustret far stack_adjust
  在 AT&T 匯編格式中,內存操作數的尋址方式是
  section:disp(base, index, scale)
  而在 Intel 匯編格式中,內存操作數的尋址方式為:
  section:[base + index*scale + disp]
  由于 Linux 工作在保護模式下,用的是 32 位線性地址,所以在計算地址時不用考慮段基址和偏移量,而是采用如下的地址計算方法:
  disp + base + index * scale
  下面是一些內存操作數的例子:
  AT&T 格式Intel 格式
  movl -4(%ebp), %eaxmov eax, [ebp - 4]
  movl array(, %eax, 4), %eaxmov eax, [eax*4 + array]
  movw array(%ebx, %eax, 4), %cxmov cx, [ebx + 4*eax + array]
  movb $4, %fs:(%eax)mov fs:eax, 4
  三、Hello World!
  真不知道打破這個傳統會帶來什么樣的后果,但既然所有程序設計語言的第一個例子都是在屏幕上打印一個字符串 “Hello World!”,那我們也以這種方式來開始介紹 Linux 下的匯編語言程序設計。
  在 Linux 操作系統中,你有很多辦法可以實現在屏幕上顯示一個字符串,但最簡潔的方式是使用 Linux 內核提供的系統調用。使用這種方法最大的好處是可以直接和操作系統的內核進行通訊,不需要鏈接諸如 libc 這樣的函數庫,也不需要使用 ELF 解釋器,因而代碼尺寸小且執行速度快。
  Linux 是一個運行在保護模式下的 32 位操作系統,采用 flat memory 模式,目前最常用到的是 ELF 格式的二進制代碼。一個 ELF 格式的可執行程序通常劃分為如下幾個部分:.text、.data 和 .bss,其中 .text 是只讀的代碼區,.data 是可讀可寫的數據區,而 .bss 則是可讀可寫且沒有初始化的數據區。代碼區和數據區在 ELF 中統稱為 section,根據實際需要你可以使用其它標準的 section,也可以添加自定義 section,但一個 ELF 可執行程序至少應該有一個 .text 部分。

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 十分钟免费看完整视频 | 国产成人cao在线 | 单亲妈妈3韩国电影免费观看 | 成人精品亚洲 | 桥本有菜黑丝 | 国产精品视频人人做人人爽 | 岛国大片在线播放免费 | 99久久国产露脸精品国产吴梦梦 | 色宅男看片午夜大片免费看 | 欧美黑人巨大xxxxx | 国产精品白浆精子流水合集 | 麻豆AV蜜桃AV久久 | 伊人久久99热这里只有精品 | 日韩精品亚洲专区在线影院 | 内射少妇36P九色 | 91综合久久久久婷婷 | 永久免费看A片无码网站四虎 | 在线播放毛片 | 国语92电影网午夜福利 | 欧美日韩精品久久久免费观看 | 国产色婷亚洲99精品AV在线 | 中文在线观看永久免费 | 亚洲精品美女久久久久99 | 欧美狂野乱码一二三四区 | 回复术士人生重启在线观看 | 为什么丈夫插我我却喜欢被打着插 | 吃寂寞寡妇的奶 | 亚洲成人99| xxxx俄罗斯1819| 国产中文欧美日韩在线 | www.免费视频| 久久99精品视频 | 日韩美女爱爱 | 被肉日常np快穿高h 被肉日常np高h | 亚洲精品国偷拍电影自产在线 | xxxx免费观看 | FREE17一18外女破 | 渔夫床满艳史bd高清在线直播 | 亚洲看片无码免费视频 | 成人人观看的免费毛片 | 国产精品igao视频网网址 |