當前位置:首頁 » 操作系統 » linux匯編指令

linux匯編指令

發布時間: 2022-05-14 08:28:27

① 如何在linux下執行匯編命令

好像是as或gas,man下試試

② 通過幾個簡單的Linux命令,深入理解c語言

主要使用gcc命令以及以下幾個參數:

-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>

環境配置好以後,讓我們開始c語言的編譯之旅吧~

編寫c語言源代碼
很多linux命令都可以新建一個文件,比如

$ touch test.c

建立一個空白的文件

$ vim test.c

使用vim(文本編輯器)編輯test.c,如果test.c不存在,則創建

$ echo "123" > test.c

通過輸出重定向新建一個文件

創建完test.c後,將下面這段Hello World代碼寫到test.c中(很多方法)

#include <stdio.h>
int main(){
printf("Hello world\n");
return 0;
}

寫完之後可以使用ls命令來查看當前目錄下的文件,檢查test.c是否存在

$ ls

使用cat命令查看test.c中的內容,檢查是否寫入成功

$ cat test.c

ls-cat

展開頭文件(預處理)
$ gcc -E test.c -o test_pre.c

這個命令把源代碼test.c中的頭文件展開,並把結果輸出到test_pre.c

(可以使用cat或者vim命令查看test_pre.c文件中的內容)
per
test_pre.c中的內容是這樣的,可以發現原本幾行的代碼變成了幾百行,而且已經見不到include關鍵字了,取而代之的是一些變數定義的代碼,這些代碼就是stdio.h中的內容,和stdio.h中頭文件展開後的內容。

編譯
$ gcc -S test_pre.c -o test_asm.s

這一條命令將上一步預處理過後的源代碼編譯成為匯編代碼

asm
現在看到的是test_asm.s裡面的匯編代碼。

什麼是匯編?

匯編語言是匯編指令集、偽指令集和使用它們規則的統稱,使用具有一定含義的符號為助憶符,用指令助憶符、符號地址等組成的符號指令稱為匯編格式指令。

簡單的可以理解為匯編語言是一本詞典,01100101011010這樣的二進制字元串是單詞,匯編指令是單詞的含義。計算機能讀懂二進制字元串,而人能讀懂的是翻譯過來的匯編指令。

匯編
$ gcc -c test_asm.s -o test_obj.o

這一步將test_asm.s匯編成為目標文件,目標文件中存儲的就是010101010這樣的字元串了,可以用cat命令試試去讀取test_obj.o

obj

可以發現列印出來許多不可見的字元,原因是目標文件已經是二進制格式的了,不同於源代碼(文本格式)

有關文件的格式可以看下這里的介紹:
http://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html

鏈接
鏈接器負責將程序的目標文件與所需的所有附加的目標文件連接起來,最終生成可執行文件。附加的目標文件包括靜態連接庫和動態連接庫。

這個例子中沒有附加的目標文件,所以只需要目標文件做被鏈接的對象。

有關鏈接器的詳細講解大家可以看下這里:
https://www.hu.com/question/27386057

$ gcc test_obj.o -o hello

gcc本身可以充當鏈接器,這里使用gcc命令將目標文件test_obj.o鏈接成了可執行文件hello

ld

運行程序!
至此,源代碼已經經歷了預處理、編譯、匯編、鏈接四步成為了可執行文件,現在試著運行一下這個程序吧

$ ./hello

hello

小結
首先我們創建了源文件test.c,然後用gcc -E將源文件中的頭文件展開,這一步叫做預處理;
之後通過gcc -S將預處理後的源文件編譯了匯編代碼,這一步叫做編譯;
接著使用gcc -c命令將匯編代碼轉換成了二進制的目標文件,這一步操作叫做匯編;
目標文件不同於源代碼,是二進制格式,是源文件編譯過程中產生的中間文件,通過鏈接器可以將多個目標文件鏈接成為可執行文件,這一步叫做鏈接。

源文件->(預處理->編譯->匯編->鏈接)->可執行文件

一般大家所說的c語言編譯,其實是上述這四步的簡稱。

③ linux內核:什麼叫做內聯匯編

就是在C語言中可以插入匯編語言,,,
比如 插入匯編
----------------C語言----------------
ASM
{
mov r1,r2
stl r2,0101 代碼我亂寫的 我給你看個大概而已
}
----------------C語言----------------

當然 要嵌入匯編
最開始的宏定義還要加上
#include <linux/asm> 好像是這個..好久不做linux了..最近作FPGA 都糊塗了

④ Linux系統里如何編譯匯編程序。

linux 編譯匯編程序常用的有兩種,一種是A&T方式的,你gcc 就可以編譯了。還有一種是80X86方式,一般是用NASM,NASM你要在安裝LINUX時就要添加軟體包,或者你進入圖型界面,增加NASM軟體包,就可以編譯了。

⑤ 如何在64位的Linux系統上使用匯編和C語言混

編譯和鏈接的時候使用的指令:(AMD處理器,64位操作系統)
編譯鏈接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
匯編語言用nasm編寫並用nasm編譯器編譯,而C語言用的是gcc編譯,這些都沒有問題,但是在鏈接的時候出錯了,提示如下:
ld: i386 architecture of input file `foo.o' is incompatible with i386:x86-64 output
google了一下,意思就是nasm 編譯產生的是32位的目標代碼,gcc 在64位平台上默認產生的是64位的目標代碼,這兩者在鏈接的時候出錯,gcc在64位平台上默認以64位的方式鏈接。
這樣在解決的時候就會有兩種解決方案:
<1> 讓gcc 產生32位的代碼,並在鏈接的時候以32位的方式進行鏈接
在這種情況下只需要修改編譯和鏈接指令即可,具體如下:
32位的編譯鏈接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具體的-m32 和 -m elf_i386 請自行查閱gcc (man gcc)

如果你是高版本的gcc(可能是由於更新內核造成的),可能簡單的使用-m32 的時候會提示以下錯誤(使用別人的歷程,自己未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
這應該是缺少構建32 位可執行程序缺少的包,使用以下指令安裝:
sudo apt-get install libc6-dev-i386
此時應該就沒有什麼問題了。

⑥ 有沒有懂linux內核源碼中的匯編代碼的#define switch_to(n){struct {long a, b;}__tmp; __asm__("cmpl "

用的at&t匯編,也就是Linux下的匯編語言,跟Intel x86匯編翻譯成i386指令是一樣的,就是寫法和符號不同。
裡面應該是__asm__()後面跟的是一個字元串,包含大量轉義字元,你把轉移字元翻譯成對於的格式再看.

⑦ 嵌入式linux:很簡單的匯編指令,關於LDR R0,R1

答案是B.
確切地說是,R1的數據+R2的數據合成一個地址值,該地址中存放的數據賦值給R0
LDR指令是從某存儲空間取數據,賦值給某寄存器.
這是ARM匯編,和Linux有什麼關系?
建議看看ARM匯編的解釋

⑧ 對linux上的匯編的一些疑問

這是at&t格式的匯編
===================================
局部標號可以用數字,而且可以重復。在以這些標號為目的的轉移指令上,標號要帶上後綴,b表示向前,f表示向後。
例:
orw %bx,%bx
jz 1f
1:
movl $0x101000,%eax
movl %eax,%cr3 /* set the page table pointer.. */
movl %cr0,%eax
orl $0x80000000,%eax
movl %eax,%cr0 /* ..and set paging (PG) bit */
jmp 1f /* flush the prefetch-queue */
1:
movl $1f,%eax
jmp *%eax /* make sure eip is relocated */
1:
絕對跳轉/調用指令中的內存操作數必須以』*』為前綴,否則gas總是認為是相對跳轉/調用指令,而且gas匯編程序自動對跳轉指令進行優化,總是使用盡可能小的跳轉偏移量。如果8比特的偏移量無法滿足要求的話,as會使用一個32位的偏移量,as匯編程序暫時還不支持16位的跳轉偏移量,所以對跳轉指令使用』addr16』前綴是無效的。還有一些跳轉指令只支持8位的跳轉偏移量,這些指令是:
』jcxz』,』jecxz』,』loop』,』loopz』,』loope』,』loopnz』』loopne』
如果你在匯編中使用了這些指令,用gas的匯編可能會出錯,因為gcc在編譯過程中不產生這些指令,所以在c語言中不必擔心這些問題。
Array、 實模式下的語法與Intel指令語法基本相同;可以用上述格式的匯編單獨寫程序(有許多宏定義和它特有的文件格式),而後用gcc/gas將其匯編成目標代碼。在linux中,這種形式的代碼主要集中在啟動部分。

⑨ 同樣的處理器,對於Linux和windows他們的匯編指令集是相同的么,他們之間的關系是怎樣

指令是針對CPU的,如PC機的CPU一般使用復雜指令系統,可以使用匯編語言進行編程。而操作系統是運行在硬體上的系統軟體,不同的操作系統編譯後可以在相同的硬體系統運行。

⑩ LINUX下面進行8086匯編

linux的內核中有很多匯編語言,但gcc是linux的唯一指定編譯器,說明匯編的編譯同樣使用gcc,只是命令參數不一樣

我美編寫過8086匯編,但我編譯過內核,確實不需要其他編譯器

回答補充:

原來是編輯器的問題,我還以為你找的全套流程呢。

我連vim都沒碰過,平時都是gedit,只有自動縮進一項功能,還很弱智,幫不上你了

這兒一點參考資料,貼出來,雖然有可能用不上

http://www.ibm.com/developerworks/cn/linux/l-assembly/

熱點內容
洗過的海帶存儲方法 發布:2024-10-10 11:19:00 瀏覽:239
64H的源碼 發布:2024-10-10 11:06:01 瀏覽:152
mc伺服器怎麼增加back指令 發布:2024-10-10 10:58:48 瀏覽:256
termux如何搭建伺服器 發布:2024-10-10 10:18:05 瀏覽:737
中國石化的電話服務密碼是多少 發布:2024-10-10 10:16:46 瀏覽:42
婚紗店宣傳片視頻腳本 發布:2024-10-10 10:08:55 瀏覽:869
android寫入文件 發布:2024-10-10 10:08:11 瀏覽:435
怎麼打開文件夾的路徑 發布:2024-10-10 10:08:06 瀏覽:61
ec伺服器怎麼有小提示 發布:2024-10-10 10:08:04 瀏覽:495
我的世界迪士尼神奇寶貝伺服器地址 發布:2024-10-10 09:03:02 瀏覽:561