當前位置:首頁 » 操作系統 » linux匯編代碼

linux匯編代碼

發布時間: 2023-09-20 15:46:24

Ⅰ 如何在64位的linux系統上使用匯編和c語言混合編程 第4頁

(1) 參數個數少於7個:
f (a, b, c, d, e, f);
a->%rdi, b->%rsi, c->%rdx, d->%rcx, e->%r8, f->%r9
g (a, b)
a->%rdi, b->%rsi
有趣的是, 實際上將參數放入寄存器的語句是從右到左處理參數表的, 這點與32位的時候一致.
CODE
2) 參數個數大於 7 個的時候
H(a, b, c, d, e, f, g);
a->%rdi, b->%rsi, c->%rdx, d->%rcx, e->%rax
g->8(%esp)
f->(%esp)
call H
易失寄存器:
%rax, %rcx, %rdx, %rsi, %rdi, %r8, %r9 為易失寄存器, 被調用者不必恢復它們的值。
顯然,這里出現的寄存器大多用於參數傳遞了, 值被改掉也無妨。而 %rax, %rdx 常用於
數值計算, %rcx 常用於循環計數,它們的值是經常改變的。其它的寄存器為非易失的,也
就是 rbp, rbx, rsp, r10~r15 的值如果在匯編模塊中被改變了,在退出該模塊時,必須將
其恢復。
教訓:
用匯編寫模塊, 然後與 c 整合, 一定要搞清楚編譯器的行為, 特別是參數傳遞的方式. 此外, 我現在比較擔心的一點是, 將來如果要把程序移植 到 WIN/VC 環境怎麼辦? 以前我用cygwin的gcc來處理匯編模塊, 用vc來處理c模塊, 只需要很少改動. 現在的問題是, 如果VC用 不同的參數傳遞方式, 那我不就麻煩了?

Ⅱ LINUX下面進行8086匯編

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

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

回答補充:

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

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

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

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

Ⅲ 如何在64位的linux系統上使用匯編和C語言混合編程

C51與匯編語言混合編程(1).C51語言中調用匯編語言程序1、在文件中選中FILEGROUP和C51程序原文件,在配置文件選項中激活「i」產生匯編(SRC)文件,「編譯(SRC)文件」和「創建工程(目標)時包含「三個選項。2、根據選擇的編譯模式,把相應的庫文件(如SMALL模式,庫文件為KEIL\C51\LIB\C51S.LIB)加入到工程中。3、在C51語言中必須聲明需要調用的函數為外部函數。externvoidDELAY(void);4、在匯編語言程序中必須聲明被調用子程序為公共子程序,在被調用的文件中還需要聲明此文件是新定位的。PUBLICDELAY,實例如下:#include"reg51.h"externvoidDELAY(void);externvoidDEL(void);voidmain(void){P1=0x00;DELAY();DEL();P!=0xff;}匯編語言文件:PUBLICDELAY,DELAY:MOVR2,#3HDJNZR2,$RETDEL:MOVR3,#3HDJNZR3,$RETEND(2)、C51語言中嵌入匯編程序:在C51語言中嵌套使用匯編語言程序要注意以下幾個問題:1、在文件中選中FILEGROUP和C51程序原文件,在配置文件選項中激活「i」產生匯編(SRC)文件,「編譯(SRC)文件」和「創建工程(目標)時包含「三個選項。2、根據選擇的編譯模式,把相應的庫文件(如SMALL模式,庫文件為KEIL\C51\LIB\C51S.LIB)加入到工程中。3、用#pragmaasm.和#pragmaendasm語句包含嵌入的匯編語言程序。實例如下:#include"reg51.h"voiddelay(void);voidmain(void){voiddelay(void);P1=0x00;#pragmaasmMOVR3,#08HDINZR3,$#pragmaendasmP1=0xff;}voiddelay(void){#pragmaasmMOVR4,#08HDJNZR4,$#pragmaendasm}

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

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

Ⅳ 對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內核代碼 匯編部分 疑問

沒研究過。

不過我記得 Linux 內核其實是兩部分,真正的內核本體是在內核文件的後部,一般都是壓縮的。之前是一個這個架構通用的啟動代碼,應該就是你這個匯編。
bootloader 的作用是把內核讀取到指定地址,之後運行這個內核,這樣運行的恰恰就是這段匯編寫的啟動代碼,這個啟動代碼的作用就是初始化環境,之後把後面本體的內核解壓縮並且寫到內存開始部分(忘了叫什麼名字)正好蓋掉 bootloader ,並且繼續運行。這樣這個運行的內核才是最終的 Linux 內核。(至少 x86 是這樣)

但每個 CPU 架構的啟動過程又有不同的地方。應該每個 CPU 都有自己特定的頭部啟動代碼。
你說這三個文件應該是有不同目的的。compressed 應該是解壓用的,kernel 裡面的應該是執行主要啟動過程的。那個 common.s 應該是「通用」部分代碼模塊。我的 comperssed 裡面還有很多 lzma 、gzip 、lzo 以及一些設備名稱的東西,應該都是「模塊」一類的吧。

你看看 Makefile 的編譯過程應該就能開除編譯調用的文件都是什麼了。

還有,你看源代碼最好看原版的,如果使用,那就去用針對性的。不然趕上找抽的人,可能針對某個開發板的代碼,會因為太過針對而不符合通用的一些規定或者習慣。

熱點內容
雲伺服器歷史演進順序 發布:2025-01-24 09:36:58 瀏覽:739
研究ftp的意義 發布:2025-01-24 09:31:22 瀏覽:253
聯想安卓升級包在哪裡下載 發布:2025-01-24 09:15:20 瀏覽:591
認票的演算法 發布:2025-01-24 09:00:45 瀏覽:927
android調用列印機 發布:2025-01-24 09:00:32 瀏覽:808
網易版我的世界伺服器如何 發布:2025-01-24 08:55:47 瀏覽:968
編譯器鼻祖 發布:2025-01-24 08:54:11 瀏覽:844
如何用安卓編譯項目 發布:2025-01-24 08:30:46 瀏覽:863
計算機同時輸出和存儲設備的區別 發布:2025-01-24 08:29:21 瀏覽:581
食物語上傳 發布:2025-01-24 07:58:44 瀏覽:754